LoginSignup
48
42

More than 3 years have passed since last update.

pandasのマルチカラムをいい感じに処理するtips

Posted at

概要

pandasでマルチカラムがひょっこり出てくると焦りませんか?
僕は焦ります .
そんなマルチカラムに対して「えいや!」とカラム名をべた書きで突っ込んでいませんか?
僕はそんなことしていました.
そんな僕が贈る,マルチカラムをいい感じに処理してフラット化するためのtipsです.

やってみる

まずは対象のDataFrameを適当に作ります


import pandas as pd

df_score = pd.DataFrame(
    {
        "name": ["hoge", "hoge", "fuga", "piyo", "hoge", "piyo", "fuga"],
        "score": [30, 35, 67, 90, 20, 70, 20],
    }
)

こんなDataFrameが作られます

スクリーンショット 2019-07-04 19.18.17.png

マルチカラムが作られるのはやっぱりgroupbyして統計特徴量を作ったときですね. ではそれを行います.

# nameごとにscoreの様々な統計特徴量を計算する
agg = {"score": ["count", "max", "min", "mean", "std"]}
df_agg = df_score.groupby("name").agg(agg)

するとこんなdf_aggはこんなDataFrameになります.

スクリーンショット 2019-07-04 19.21.54.png

マルチカラムが出てきた!
見てみるとこんな感じです.

print(df_agg.columns)

# 以下出力
# MultiIndex(levels=[['score'], ['count', 'max', 'min', 'mean', 'std']],
#           codes=[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4]])

さあ, こいつをなんとかします! と言っても覚えておくのはひとつだけ.

これだけ覚える!

columnsのvaluesにアクセスする!
実際アクセスしてみると...

print(df_agg.columns.values)

# 以下出力
# array([('score', 'count'), ('score', 'max'), ('score', 'min'),
#       ('score', 'mean'), ('score', 'std')], dtype=object)

なんだか処理しやすそうな形になりましたね.
あとは煮るなり焼くなりしてもらって大丈夫です.

カラムをスネークケース(もしくはキャメルケースにしたい)

さらに丁寧にマルチカラムをスネークケース, もしくはキャメルケースにする関数をメモしておきます.

def get_converted_multi_columns(df, *, to_snake_case=True):
    if to_snake_case:
        return [col[0] + '_' + col[1] for col in df.columns.values]
    else:
        return [col[0] + col[1].capitalize() for col in df.columns.values]

基本的にはスネークケースにしようってやつです.キャメルケースにしたかったら明示的に引数にto_snake_case=Falseを指定してください.
使ってみるとこんな感じです.

print(get_converted_multi_columns(df_agg))

# 以下出力
# ['score_count', 'score_max', 'score_min', 'score_mean', 'score_std']
print(get_converted_multi_columns(df_agg, to_snake_case=False))

# 以下出力
# ['scoreCount', 'scoreMax', 'scoreMin', 'scoreMean', 'scoreStd']

いい感じで処理できていますね.

まとめ

  • マルチカラムにはdf.columns.valuesでアクセスすると処理しやすい形を得られるよ
  • このトピックをスタックしておくと便利かもしれないよ

まとめが簡単すぎて媚びちゃいました.
いいねもらえたら泣いて喜びます.
よきpandasライフを〜

48
42
0

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
48
42