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
Vous devez supprimer uniquement index name
, utilisation rename_axis
(nouveau dans pandas
0.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
La façon dont cela fonctionne pour moi est
df_cross=pd.DataFrame(pd.crosstab(df[c1], df[c2]).to_dict()).reset_index()