概要
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が作られます
マルチカラムが作られるのはやっぱりgroupby
して統計特徴量を作ったときですね. ではそれを行います.
# nameごとにscoreの様々な統計特徴量を計算する
agg = {"score": ["count", "max", "min", "mean", "std"]}
df_agg = df_score.groupby("name").agg(agg)
するとこんなdf_agg
はこんなDataFrameになります.
マルチカラムが出てきた!
見てみるとこんな感じです.
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ライフを〜