首页 > 解决方案 > Pandas concat 似乎忽略了索引

问题描述

我对熊猫比较陌生。我遇到了一个意想不到的问题,pd.concat()我没想到。

df1 = pd.DataFrame([], columns=['a', 'b', 'c']).set_index(['b', 'a'])
df2 = pd.DataFrame([[1, 2, 3]], columns=['a', 'b', 'c']).set_index(['a', 'b']) # intentionally reverse
pd.concat([df1, df2])

我希望上面的结果是:

     c
a b
1 2  3

但它是:

     c
b a <---- note that b=1 and a=2 here
1 2  3

换句话说,似乎pd.concat()在执行时忽略了索引标头pd.concat(),但在完成后重新标记标头pd.concat()

另一方面,pd.concat()正如我对列标题的期望一样。结果pd.concat([df1.reset_index(), df2.reset_index()])是:

     a    b  c
0  1.0  2.0  3

正如预期的那样。

我观察到的行为pd.concat()和索引是预期的行为吗?

我试着用谷歌搜索,但我找不到有人遇到类似问题的例子。

谢谢!

标签: pythonpandas

解决方案


似乎熊猫concat期间:

  • 仅从第一个DataFrame中获取索引列名称。
  • 但是对于进一步的 DataFrame,只要索引列匹配,只有列号很重要。

因此,如果df1 MultiIndex 由第1列和第0列组成(编号从0开始,但在df2df3中- 由第0列和第 1列组成, 无论它们的名称如何

要确认它,请尝试更广泛的示例:

df1 = pd.DataFrame([], columns=['a', 'b', 'c']).set_index(['b', 'a'])
df2 = pd.DataFrame([[1, 2, 3]], columns=['aa', 'bb', 'c']).set_index(['aa', 'bb'])
df3 = pd.DataFrame([[10, 20, 30]], columns=['xx', 'yy', 'c']).set_index(['xx', 'yy'])
pd.concat([df1, df2, df3])

结果是:

        c
b  a     
1  2    3
10 20  30

如您所见,即使源列名称(仅用于索引列)不同,这也没有任何意义。只有它们在列中的位置很重要。

但是,如果您更改第三列名称(常规列):

df3 = pd.DataFrame([[10, 20, 30]], columns=['xx', 'yy', 'cc']).set_index(['xx', 'yy'])

( c改为 *cc),结果不同:

         c    cc
b  a            
1  2   3.0   NaN
10 20  NaN  30.0

推荐阅读