pandas合并同列名DataFrame后创建多级列索引的简便方案
你完全可以在concat操作阶段直接实现需求,不需要后续单独修改列索引。
错误原因说明
你之前的写法报错是因为:c是已经拼接完成的DataFrame,列长度为4,用pd.MultiIndex.from_product([c.columns, ['FOO', 'BAR']])会生成4*2=8个索引项,和实际列的长度不匹配,自然抛出长度不匹配的错误。
最优实现方案
直接使用pd.concat自带的keys参数,给两个子DataFrame指定上层列索引名即可:
#!/usr/bin/env python3 import pandas as pd a = pd.DataFrame({'X': [1,2], 'Y': [3, 4]}) b = pd.DataFrame({'X': [9,8], 'Y': [7, 6]}) # 拼接时直接传入keys生成多级列索引 c = pd.concat([a, b], axis=1, keys=['FOO', 'BAR'])
运行后得到的c的列结构和你预期完全一致,列索引结构如下:
MultiIndex([('FOO', 'X'), ('FOO', 'Y'), ('BAR', 'X'), ('BAR', 'Y')], )
提前处理单个DataFrame的方案
如果你确实需要在拼接前先处理两个单独的DataFrame,也可以分别给每个DataFrame设置多级列索引后再拼接:
import pandas as pd a = pd.DataFrame({'X': [1,2], 'Y': [3, 4]}) b = pd.DataFrame({'X': [9,8], 'Y': [7, 6]}) # 给a添加上层索引FOO a.columns = pd.MultiIndex.from_product([['FOO'], a.columns]) # 给b添加上层索引BAR b.columns = pd.MultiIndex.from_product([['BAR'], b.columns]) c = pd.concat([a, b], axis=1)
该方案和直接使用keys参数的效果完全相同。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

