如何使用Pandas将列值与现有列转换为多级列?
嘿,我完全get到你想要的这种多级表头转换需求了!不用纠结iterrows那种低效的方法,用pivot配合几步层级调整就能完美解决,咱们一步步来:
首先,先确认下你的原始DataFrame结构(我猜你可能排版时列和行对应有点小问题,先把正确的示例数据构造出来方便复现):
import pandas as pd data = { 'date': ['20000103', '20000104', '20000105', '20000106', '20000103', '20000104', '20000105', '20000106'], 'ticker': ['company1', 'company1', 'company1', 'company1', 'company2', 'company2', 'company2', 'company2'], 'PX_LAST': [1234, 2345, 3465, 4567, 1, 2, 3, 4], 'PX_OPEN': [6543, 7654, 8765, 9876, 6, 7, 8, 9] } df = pd.DataFrame(data)
接下来是核心步骤,每一步都很清晰:
透视生成基础多级列结构
用pivot把ticker转成列的一个层级,同时按date分组:pivoted = df.pivot(index='date', columns='ticker', values=['PX_LAST', 'PX_OPEN'])这时候生成的列层级是
[字段, 公司],但我们需要的是[公司, 字段],所以下一步调整层级。交换列层级并排序
用swaplevel交换列的两个层级,再排序让同一公司的字段挨在一起:pivoted = pivoted.swaplevel(axis=1).sort_index(axis=1)调整表头和列结构
把date索引转成普通列,然后给这个列设置和其他列匹配的多级表头:pivoted = pivoted.reset_index() # 重新构造多级列名,把date列命名为('ticker', 'field') pivoted.columns = pd.MultiIndex.from_tuples( [('ticker', 'field')] + list(pivoted.columns[1:]) )输出最终格式
如果不想显示行索引,直接用to_string(index=False)打印:print(pivoted.to_string(index=False))
最终输出的结果完全符合你的需求:
ticker company1 company2 field PX_LAST PX_OPEN PX_LAST PX_OPEN 20000103 1234 6543 1 6 20000104 2345 7654 2 7 20000105 3465 8765 3 8 20000106 4567 9876 4 9
整个过程都是pandas的矢量化操作,效率比iterrows高太多,代码也清晰易读~
内容的提问来源于stack exchange,提问作者displayname
相关产品推荐
相关产品推荐

