如何用Pandas将长格式DataFrame转换为指定宽格式?
Pandas实现长格式转宽格式(替代R reshape2::cast)
嘿,刚好我也用过R的reshape2,Pandas里对应的功能其实用pivot或者pivot_table就能完美解决,完全满足你把长格式转成指定宽格式的需求!
先看你的原始数据:
import pandas as pd x = {'col0': [1, 1, 2, 2], 'col1': ['a', 'b', 'a', 'b'], 'col2': ['x', 'x', 'x', 'x'], 'col3': [12, 13, 14, 15]} y = pd.DataFrame(data=x)
方法1:用pivot(无重复组合时首选)
因为你的数据里col0 + col1 + col2的组合是唯一的,没有重复值,直接用pivot就可以:
# 先做透视转换 y_pivot = y.pivot( index='col0', # 作为行标识的列(对应cast里的id变量) columns=['col1', 'col2'], # 用来展开成新列的分组变量 values='col3' # 填充到新列的数值(对应cast里的value变量) ).reset_index() # 把多级列名改成你要的格式:col3__{col1}_{col2} y_pivot.columns = ['col0'] + [f'col3__{col1}_{col2}' for col1, col2 in y_pivot.columns[1:]] # 最终结果就是你要的y2 y2 = y_pivot
运行后得到的y2就是:
| col0 | col3__a_x | col3__b_x |
|---|---|---|
| 1 | 12 | 13 |
| 2 | 14 | 15 |
方法2:用pivot_table(有重复组合时用)
如果你的数据里存在同一个col0 + col1 + col2对应多个col3值的情况(比如重复记录),就用pivot_table,可以指定聚合函数(比如求和、均值):
y_pivot = y.pivot_table( index='col0', columns=['col1', 'col2'], values='col3', aggfunc='mean' # 这里用均值,你可以换成sum、max等适配需求 ).reset_index() # 同样处理列名 y_pivot.columns = ['col0'] + [f'col3__{col1}_{col2}' for col1, col2 in y_pivot.columns[1:]]
适配col1多值的情况
不管你的col1有3种还是更多不同值,这个代码都能自动生成对应的列。比如如果col1新增了c,代码会自动生成col3__c_x列,完全不用手动修改!
内容的提问来源于stack exchange,提问作者Chase Grimm
相关产品推荐
相关产品推荐

