web-dev-qa-db-ja.com

ピボットテーブルパンダを使用した後にマルチレベルインデックスを削除する方法

私は次のデータフレームを持っていました(実際のデータフレームはこれよりはるかに大きいです):

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

次に、次のコードを使用して、sale_product_idの値を列ヘッダーとして移動するように形状を変更します。

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

結果のデータフレームは次のとおりです。

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

ご覧のとおり、マルチレベルインデックスがあります。マルチレベルインデックスを作成せずに、最初の列にsale_user_isを含める必要があります。

私は次のアプローチをとります:

reshaped_df.reset_index()

結果は次のようになります。私はまだsales_product_id列を持っていますが、もう必要ありません。

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 

このデータフレームをサブセット化してsale_product_idを取り除くことができますが、効率的ではないと思います。元のデータフレームを再形成しながらマルチレベルインデックスを取り除く効率的な方法を探しています

19
chessosapiens

index nameのみを削除する必要があります。 rename_axis を使用します(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

pandas 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

必要に応じて、columns nameも削除します。

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

別の解決策:

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

コメントで編集:

reset_index パラメータ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

列名のみを削除する必要がある場合:

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:

したがって、indexから新しい列を作成し、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

それが私のために働く方法は

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