関数の機能
役に立つシーン
- pythonのmulti columnsをsingle columnになおす。
- mergeするときにmulti columnsはちょっと不便。
- df.groupby("hoge").agg("A":{"sum","mean"]}) で集計した値がmulti columnsになってしまうので、結合するときに使用しました。
- 既存の関数がありそうな気がしたが探しても見つからなかった...有識者の方教えて下さい。
マルチカラムの参考
- pandasのMultiIndexから任意の行・列を選択、抽出: https://note.nkmk.me/python-pandas-multiindex-indexing/
- pandasのマルチカラムをいい感じに処理するtips: https://qiita.com/tenajima/items/55bb8b5843690d464225
実際のコード
#dfの1行目、2行目の列名を連結した列名に変換する関数
def rename_multicol(df):
df_col=df.columns #列名をコピー
df = df.T.reset_index(drop=False).T #一回列名をリセット
for i in range(df.shape[1]): #列名を新たに定義
rename_col = {i:"".join(df_col[i])}
df = df.rename(columns = rename_col)
df = df.drop(["level_0","level_1"],axis=0)
return df
実際にこの関数を使った例がこちら。
company_list =["A","B","C","D","E","F","G"]
pref_list = ["東京","沖縄", "東京", "神奈川", "神奈川", "東京", "沖縄"]
num_list = [10,3,6,4,5,7,2]
df = pd.DataFrame({"会社名":company_list,
"都道府県":pref_list,
"人数":num_list})
#人数の合計と平均を計算
number_df = df.groupby("都道府県",as_index=False).agg({"人数":["sum","mean"]})
#シングルカラムに変換する
number_df_rename = rename_multicol(number_df)
dfから都道府県ごとの人数の合計と平均を集計したいとします。
'df.groupby("都道府県",as_index=False).agg({"人数":["sum","mean"]})'で同時に集計かのうです。
集計後のnumber_df。人数とsum,meanがmulti columnsになっている。
rename_multicolの関数をつかってsingle columnsに変換したnumber_df_rename。
これで都道府県をkeyとして別のdataframeと結合できます。
終わりに
そもそもmulticolumnsっていうのも知らずに「複数列 解除」とかで検索してました...。
テーブル単体でいうと便利ですけど結合を考えると取りあつかいずらかったです。