Pandas行转列:将Fund转为列并按TradeGroup分组
问题:DataFrame 行列转换(TradeGroup分组,Fund转为列)
原始DataFrame格式
| Date | Fund | TradeGroup | LongShort | Alpha | Details |
|---|---|---|---|---|---|
| 2018-05-22 | A | TGG-A | Long | 3.99 | Misc |
| 2018-05-22 | A | TGG-B | Long | 4.99 | Misc |
| 2018-05-22 | B | TGG-A | Long | 5.99 | Misc |
| 2018-05-22 | B | TGG-B | Short | 6.99 | Misc |
| 2018-05-22 | C | TGG-A | Long | 1.99 | Misc |
| 2018-05-22 | C | TGG-B | Long | 5.29 | Misc |
需求说明
需要将TradeGroup作为分组依据,把Fund转为列名,丢弃LongShort和Details列,最终得到如下格式的DataFrame:
| TradeGroup | Date | A | B | C |
|---|---|---|---|---|
| TGG-A | 2018-05-22 | 3.99 | 5.99 | 1.99 |
| TGG-B | 2018-05-22 | 4.99 | 6.99 | 5.29 |
解决方案
你之前用df.pivot()没得到想要的结果,大概率是参数设置没到位。咱们用pivot或者pivot_table都能轻松实现,步骤如下:
- 先清理数据:删掉不需要的
LongShort和Details列,只保留核心字段; - 执行行列转换:指定正确的索引、列和值参数;
- 调整结构:把索引转回普通列,去掉多余的列层级名称。
代码实现(两种方法可选)
方法1:使用pivot(适合无重复组合的数据)
import pandas as pd # 假设你的原始DataFrame是df # 第一步:删除无关列 df_clean = df.drop(['LongShort', 'Details'], axis=1) # 第二步:执行pivot转换,把TradeGroup和Date作为联合索引,Fund作为列,Alpha作为值 result_df = df_clean.pivot( index=['TradeGroup', 'Date'], columns='Fund', values='Alpha' ).reset_index() # 第三步:去掉列名的层级标签,让格式更贴合需求 result_df.columns.name = None # 查看最终结果 print(result_df)
方法2:使用pivot_table(适合有重复组合的数据,容错性更强)
如果你的数据中存在同一TradeGroup+Date+Fund的重复记录,可以用这个方法,指定聚合函数(比如取第一个值):
result_df = df_clean.pivot_table( index=['TradeGroup', 'Date'], columns='Fund', values='Alpha', aggfunc='first' # 如果有重复值,可换成'mean'/'sum'等 ).reset_index() result_df.columns.name = None
运行后就能得到你想要的目标格式啦~
内容的提问来源于stack exchange,提问作者CodeSsscala
相关产品推荐
相关产品推荐

