在Python Pandas中向列索引添加级别

11 投票
1 回答
4920 浏览
提问于 2025-04-17 23:41

我有几个数据框,它们的列是一样的,我想只根据它们的索引来合并这些数据框。

print df1

out[]:               Value  ISO
       Id                      
       200001   8432000000  USD
       200230  22588186000  USD
       200247   4633000000  USD
       200291   1188880000  USD
       200418   1779776000  USD

print df2

out[]:               Value  ISO
      Id                       
      200001  1.309168e+11  USD
      200230  5.444096e+10  USD
      200247  9.499602e+09  USD
      200291  2.089603e+09  USD
      200418  3.827251e+09  USD

print df3

out[]:           Value
      Id                       
      200001  3.681908
      200230  3.408507
      200247  4.531866
      200291  0.273029
      200418  3.521822

我可以使用

pd.concat([df1, df2, df3], axis=1)

这样做,然后得到

out[]:              Value  ISO         Value  ISO     Value
      Id                                                   
      200001   8432000000  USD  1.309168e+11  USD  3.681908
      200230  22588186000  USD  5.444096e+10  USD  3.408507
      200247   4633000000  USD  9.499602e+09  USD  4.531866
      200291   1188880000  USD  2.089603e+09  USD  0.273029
      200418   1779776000  USD  3.827251e+09  USD  3.521822

但是这样我就失去了每一列来源的信息。我也可以对两个数据框进行合并,并使用后缀参数

print df1.merge(df2, left_index=True, right_index=True, suffixes=('_1', '_2'))

这样可以得到

out[]:            Value_1 ISO_1       Value_2 ISO_2
      Id                                           
      200001   8432000000   USD  1.309168e+11   USD
      200230  22588186000   USD  5.444096e+10   USD
      200247   4633000000   USD  9.499602e+09   USD
      200291   1188880000   USD  2.089603e+09   USD
      200418   1779776000   USD  3.827251e+09   USD

然后我可以把我的合并串联起来,但后缀参数只适用于那些名字相同的列。一旦我给第一次合并加了后缀,第三个数据框的列名就不再相同了。

我想出的解决办法是给每个数据框的列索引添加一个层级,里面包含区分这些列所需的信息。然后我可以运行 pd.concat(),得到像这样的结果:

print pd.concat([df1_, df2_, df3_], axis=1)

out[]:Source           df1                df2            df3
                     Value  ISO         Value  ISO     Value
      200001     8.432e+09  USD  1.309168e+11  USD  3.681908
      200230  2.258819e+10  USD  5.444096e+10  USD  3.408507
      200247     4.633e+09  USD  9.499602e+09  USD  4.531866
      200291   1.18888e+09  USD  2.089603e+09  USD  0.273029
      200418  1.779776e+09  USD  3.827251e+09  USD  3.521822

不过,为了实现这个效果,我不得不这样处理数据框:

df1_ = df1.T
df1_['Source'] = 'df1'
df1_.set_index('Source', append=True, inplace=True)
df1_.index = df1_.index.swaplevel(0, 1)
df1_ = df1_.T

最终,我希望结果看起来像最后的合并语句。有没有更好的方法来实现这个?有没有更好的方法来给列索引添加一个层级?

谢谢,
PiR

1 个回答

15

如果你想要一个多重索引(MultiIndex),可以直接在 concat 函数里这样做,就能得到相同的结果,比如:

pd.concat([df1, df2, df3], axis=1, keys=['df1', 'df2', 'df3'])

或者

pd.concat({'df1':df1, 'df2':df2, 'df3':df3}, axis=1)

另外,你可以查看这个链接了解更多信息:从一系列数据框创建多重索引数据框

撰写回答