如何用更简便的方法重塑Pandas DataFrame?
Pandas DataFrame 重塑的简便实现
先看你的原始数据构造代码:
import pandas as pd L = range(0,12) df = pd.DataFrame( { 'Col_1': ['a', 'b', 'c','a', 'b', 'c','a', 'b', 'c','a', 'b', 'c'], 'Col_2': ['', '', '','', '', '','', '', '','', '', ''], 'Col_3': ['x', 'y', 'z','xx', 'yy', 'zz','xxx', 'yyy', 'zzz','x1', 'y2', 'z3'] }, index = L )
从数据结构能看出来,Col_1的a/b/c每3行构成一组,每组对应Col_3的一组值,目标是把每组的a/b/c转为列,每组对应一行。下面是两种比自定义冗长函数简便得多的实现方式:
方法1:用pivot配合组编号
先给每组添加一个标识列,再通过pivot直接完成重塑:
# 生成组编号:每个Col_1值的出现次数作为组ID df['group_id'] = df.groupby('Col_1').cumcount() # 执行重塑 reshaped_df = df.pivot(index='group_id', columns='Col_1', values='Col_3').reset_index(drop=True)
方法2:用groupby + unstack(更简洁)
不需要额外添加列,直接通过分组后转置完成:
# 按Col_1分组提取Col_3值,转为Series后转置 reshaped_df = df.groupby('Col_1')['Col_3'].apply(list).apply(pd.Series).T
两种方法最终得到的结果一致,结构如下:
a b c 0 x y z 1 xx yy zz 2 xxx yyy zzz 3 x1 y2 z3
内容的提问来源于stack exchange,提问作者Alan Nuñez
相关产品推荐
相关产品推荐

