python - 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()
和索引是预期的行为吗?
我试着用谷歌搜索,但我找不到有人遇到类似问题的例子。
谢谢!
解决方案
似乎熊猫在concat期间:
- 仅从第一个DataFrame中获取索引列名称。
- 但是对于进一步的 DataFrame,只要索引列匹配,只有列号很重要。
因此,如果df1 MultiIndex 由第1列和第0列组成(编号从0开始,但在df2和df3中- 由第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
推荐阅读
- java - 使用命令行运行时出现“java.lang.NoClassDefFoundError: javassist/ClassPath”的奇怪异常
- keras - 部署时如何隐藏或加密我自己的keras模型文件(如h5)?
- swift - 如何在拇指位置提取 uislider 渐变颜色?
- javascript - 向对象添加新的键值对 - REACT NATIVE
- tensorflow - TimeDistributed Convolution2D Keras 的正确输入
- windows - 使用 .bat 文件回答多个控制台提示
- javascript - 设置后在函数中使用新状态
- latex - Sphinx LaTeX 目录 - 避免包含的 rst 文件的目录树嵌套
- java - 内存/堆转储中有大量重复字符串
- regex - 如何在一行中修改三个命令(正则表达式)以在 sed(而不是 fnr.exe)中使用