Pandas的concat似乎忽略了索引

3

我对Pandas相对较新。在使用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([df1.reset_index(), df2.reset_index()])的结果如下:
     a    b  c
0  1.0  2.0  3

正如预期。

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

我尝试过在谷歌上搜索,但我还没有找到类似问题的例子。

谢谢!

1个回答

1
似乎在使用concat时,Pandas
  • 仅从第一个DataFrame中获取索引列的名称。
  • 但对于后续的DataFrames,只有列数字很重要, 只要索引列匹配即可。

因此,在df1的情况下,MultiIndex由列10组成(编号 从0开始,但在df2df3中 - 由列01组成, 无论它们的名称是什么

为了确认这一点,请尝试更广泛的示例:

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 changed to *cc), the result is different:

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

我也注意到了这一点。它匹配列但不匹配索引。奇怪的是,如果索引只有一列,在此过程中会删除索引名称(至少这样不那么令人困惑?)。 - bacchuswng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接