web-dev-qa-db-fra.com

Comment se débarrasser de l'index à plusieurs niveaux après avoir utilisé des pandas de tableau croisé dynamique?

J'ai eu la trame de données suivante (la trame de données réelle est beaucoup plus grande que celle-ci):

sale_user_id    sale_product_id count
1                 1              1
1                 8              1
1                 52             1
1                 312            5
1                 315            1

Puis remodelé pour déplacer les valeurs dans sale_product_id en tant qu'en-têtes de colonne en utilisant le code suivant:

reshaped_df=id_product_count.pivot(index='sale_user_id',columns='sale_product_id',values='count')

et la trame de données résultante est:

sale_product_id -1057   1   2   3   4   5   6   8   9   10  ... 98  980 981 982 983 984 985 986 987 99
sale_user_id                                                                                    
1                NaN    1.0 NaN NaN NaN NaN NaN 1.0 NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3                NaN    1.0 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4                NaN    NaN 1.0 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

comme vous pouvez le voir, nous avons un index à plusieurs niveaux, ce dont j'ai besoin est d'avoir sale_user_is dans la première colonne sans indexation à plusieurs niveaux:

j'adopte l'approche suivante:

reshaped_df.reset_index()

le résultat serait comme ça j'ai toujours la colonne sale_product_id, mais je n'en ai plus besoin:

sale_product_id sale_user_id    -1057   1   2   3   4   5   6   8   9   ... 98  980 981 982 983 984 985 986 987 99
0                          1    NaN 1.0 NaN NaN NaN NaN NaN 1.0 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1                          3    NaN 1.0 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2                          4    NaN NaN 1.0 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 

je peux sous-définir ce bloc de données pour se débarrasser de sale_product_id mais je ne pense pas que ce serait efficace.Je cherche un moyen efficace de se débarrasser de l'indexation à plusieurs niveaux tout en remodelant le bloc de données d'origine

19
chessosapiens

Vous devez supprimer uniquement index name, utilisation rename_axis (nouveau dans pandas0.18.0):

print (reshaped_df)
sale_product_id  1    8    52   312  315
sale_user_id                            
1                  1    1    1    5    1

print (reshaped_df.index.name)
sale_user_id

print (reshaped_df.rename_axis(None))
sale_product_id  1    8    52   312  315
1                  1    1    1    5    1

Une autre solution fonctionnant en pandas ci-dessous 0.18.0:

reshaped_df.index.name = None
print (reshaped_df)

sale_product_id  1    8    52   312  315
1                  1    1    1    5    1

Si besoin, supprimez columns name aussi:

print (reshaped_df.columns.name)
sale_product_id

print (reshaped_df.rename_axis(None).rename_axis(None, axis=1))
   1    8    52   312  315
1    1    1    1    5    1

Une autre solution:

reshaped_df.columns.name = None
reshaped_df.index.name = None
print (reshaped_df)
   1    8    52   312  315
1    1    1    1    5    1

MODIFIER par commentaire:

Vous avez besoin reset_index avec le paramètre drop=True:

reshaped_df = reshaped_df.reset_index(drop=True)
print (reshaped_df)
sale_product_id  1    8    52   312  315
0                  1    1    1    5    1

#if need reset index nad remove column name
reshaped_df = reshaped_df.reset_index(drop=True).rename_axis(None, axis=1)
print (reshaped_df)
   1    8    52   312  315
0    1    1    1    5    1

Si nécessaire, supprimez uniquement le nom de la colonne:

reshaped_df = reshaped_df.rename_axis(None, axis=1)
print (reshaped_df)
              1    8    52   312  315
sale_user_id                         
1               1    1    1    5    1

Edit1:

Donc, si besoin, créez une nouvelle colonne à partir de index et supprimez columns names:

reshaped_df =  reshaped_df.rename_axis(None, axis=1).reset_index() 
print (reshaped_df)
   sale_user_id  1  8  52  312  315
0             1  1  1   1    5    1
16
jezrael

La façon dont cela fonctionne pour moi est

df_cross=pd.DataFrame(pd.crosstab(df[c1], df[c2]).to_dict()).reset_index()
0
Yury Wallet