如何用Pandas从多个DataFrame创建指定结构的多级索引DataFrame
问题
现有两个结构完全一致的Pandas DataFrame:df1和df2,二者行索引都是['t1','t2','t3'],列名都是['A','B']。想要快速生成一个多级索引的DataFrame df3,要求它的多级行索引是['t1','t2','t3'](一级)和['A','B'](二级),列名为['df1','df2'],而且不用pd.MultiIndex这类复杂方法手动构建索引。
相关代码示例如下:
import pandas as pd l1 = [[1,2], [3,4], [5,6]] l2 = [[10,20], [30, 40], [50, 60]] df1 = pd.DataFrame(l1) df2 = pd.DataFrame(l2) df1.index = ["t1", "t2", "t3"] df2.index = ["t1", "t2", "t3"] df1.columns = ["A", "B"] df2.columns = ["A", "B"] # df1的输出 print(df1) # A B # t1 1 2 # t2 3 4 # t3 5 6 # df2的输出 print(df2) # A B # t1 10 20 # t2 30 40 # t3 50 60 # 期望得到的df3结构 print(df3) # df1 df2 # t1 # A 1 10 # B 2 20 # t2 # A 3 30 # B 4 40 # t3 # A 5 50 # B 6 60
解决方案
直接用stack()和pd.concat组合就能搞定,全程不用手动创建多级索引:
一行代码实现
df3 = pd.concat([df1.stack(), df2.stack()], axis=1, keys=['df1', 'df2'])
原理说明
df1.stack()会把原DataFrame的列名(A、B)转成二级行索引,保留原行索引(t1、t2、t3)作为一级索引,自动生成我们需要的多级索引结构;pd.concat按列合并两个经过stack()处理的Series,通过keys参数指定新列名df1和df2,直接得到目标结构的DataFrame。
运行后输出的df3就和预期完全一致。
内容的提问来源于stack exchange,提问作者WWW
相关产品推荐
相关产品推荐

