pandasがバージョンアップして0.25になってました。新機能は何かしらんと思って調べると利便性が高そうな機能がexplode。
使う場面としてはセルの中にカンマやパイプ区切りでデータが入っている場合。
df = 下記のdataframeでC列を値毎に分けたいもの。
A | B | C |
---|---|---|
a1 | b1 | c11,c12,c13,c14 |
a2 | b2 | c21,c22,c23 |
a3 | b3 | c31,c32,c34,c387 |
のような形。
!pip install pandas==0.25
df = pd.DataFrame([{'A':'a1','B':'b1','C':'c11,c12,c13,c14'},
{'A':'a2','B':'b2','C':'c21,c22,c23'},
{'A':'a3','B':'b3','C':'c31,c32,c34,c387'}])
0.24だと
df_temp = pd.DataFrame(df['C'].str.split(',',expand=True).stack())
pd.merge(df.reset_index(),df_temp.reset_index(),left_on='index', right_on='level_0').set_index('index').drop(columns=['C','level_0','level_1'])
としないといけなかったけど、
0.25なら
df.assign(C=df['C'].str.split(',')).explode('C')
とやればOK。便利!!
0.24でもっといい方法あるかもですが(^^;)
次はdplyrなどでの実現方法を検討しないと。
2021/6/14 なんか動作がおかしい場面に出くわしたので注意喚起。
2021/9/14追記:
参考で、R(dplyr)で同じような処理をする場合の書き方。こっちもわかりやすくていい。
explode_df <- df %>%
mutate(C = strsplit(as.character(C), ",")) %>%
unnest(C)