在 python pandas 中将级别附加到列索引

Posted

技术标签:

【中文标题】在 python pandas 中将级别附加到列索引【英文标题】:Append Level to Column Index in python pandas 【发布时间】:2014-05-02 06:02:17 【问题描述】:

我有几个具有相同列的数据框,我只想合并它们的索引。

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

但是我丢失了每列来自哪里的信息。 我还可以对两个数据帧进行合并并使用 suffixes 参数

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

最终,我希望结果看起来很像最后一个 concat 语句。有没有更好的方法可以到达那里?有没有更好的方法将级别附加到列索引?

谢谢, 皮尔

【问题讨论】:

Multi-index dataframe from sequence of dataframes的可能重复 【参考方案1】:

我想要一个 MultiIndex,你可以直接在concat 函数中执行此操作以获得相同的结果,例如:

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

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

另见Multi-index dataframe from sequence of dataframes

【讨论】:

关闭字典括号时有错字。应该是 而不是 ]。 谢谢,现在修好了!

以上是关于在 python pandas 中将级别附加到列索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pandas 中将新类别附加到 HDF5?

在 Pandas 中将两个 MultiIndex 级别合并为一个

将级别附加到 pandas MultiIndex

pandas将某一行设置为列索引(python)

熊猫:从多级列索引中删除一个级别?

在循环中将字典附加到熊猫数据框