12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DataFrameでmulti columnsをsingle columnに戻す関数

Last updated at Posted at 2020-06-04

関数の機能

このようなmulti columnsのデータフレームを
WS000001.JPG

single columnsのデータフレームに変換します。
WS000002.JPG

役に立つシーン

  • pythonのmulti columnsをsingle columnになおす。
  • mergeするときにmulti columnsはちょっと不便。
  • df.groupby("hoge").agg("A":{"sum","mean"]}) で集計した値がmulti columnsになってしまうので、結合するときに使用しました。
  • 既存の関数がありそうな気がしたが探しても見つからなかった...有識者の方教えて下さい。

マルチカラムの参考

実際のコード

#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"]})'で同時に集計かのうです。
WS000000.JPG

集計後のnumber_df。人数とsum,meanがmulti columnsになっている。
WS000001.JPG

rename_multicolの関数をつかってsingle columnsに変換したnumber_df_rename。
これで都道府県をkeyとして別のdataframeと結合できます。
WS000002.JPG

終わりに

そもそもmulticolumnsっていうのも知らずに「複数列 解除」とかで検索してました...。
テーブル単体でいうと便利ですけど結合を考えると取りあつかいずらかったです。

12
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?