Pandas DataFrame行分组转置:自定义列名及去重问题求助
Pandas 数据重塑:按分组转换列名并去重
你的代码存在两个核心问题:
- assign循环中生成的lambda函数延迟执行,最终都引用了循环最后一次的
c值,导致b_2021列数值错误 - 未对
a列做分组聚合,所以保留了原始6行数据,出现a列重复
正确实现方法
使用pivot方法直接完成分组、列转换和去重,代码如下:
import pandas as pd df = pd.DataFrame({ 'a':[111, 111, 222, 222, 333, 333], 'b':[2020, 2021, 2020, 2021, 2020, 2021], 'c':[33.2, 48.3, 32.2, 45.5, 45.5, 78.4] }) # 重塑数据:按a分组,将b的取值转为列,c作为对应值 result_df = df.pivot(index='a', columns='b', values='c').reset_index() # 调整列名为目标格式 result_df.columns = ['a'] + [f'b_{year}' for year in result_df.columns[1:]] print(result_df)
代码说明
pivot(index='a', columns='b', values='c'):自动按a分组,把b中的年份值转为列名,c的数值对应填充,天然去重a列,得到3行结果- 最后通过列表推导式修改列名,将年份列改为
b_年份的格式
原代码问题解析
- 循环生成lambda时,所有lambda不会立即执行,直到assign完成后才会取值,此时所有lambda引用的都是循环最后一次的
df['b'].iloc[i]对应的c值,导致列值错误 - 没有做分组或去重操作,所以保留了原始的6行数据,
a列重复
内容的提问来源于stack exchange,提问作者Praveena
相关产品推荐
相关产品推荐

