最佳答案
pd.concat
?levels
argument for?keys
的论点是什么?熊猫的 concat
函数是合并实用程序的 瑞士军刀。在各种各样的情况下,它是有用的是无数的。现有的文档遗漏了一些关于可选参数的细节。其中包括 levels
和 keys
参数。我着手研究这些论点的作用。
我将提出一个问题,作为进入 pd.concat
的许多方面的门户。
考虑数据帧 d1
、 d2
和 d3
:
import pandas as pd
d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), [2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), [1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), [1, 3])
如果我把这些连接起来
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'])
我用 columns
对象的 pandas.MultiIndex
得到了预期的结果:
A B C D
d1 2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
d2 1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
d3 1 0.7 0.8 NaN 0.9
3 0.7 0.8 NaN 0.9
然而,我想使用 levels
argument documentation:
级别 : 序列列表,默认为无。 Specific levels (unique values) to use for constructing a MultiIndex. Otherwise, they will be inferred from the keys.
所以我通过了
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2']])
做个血氧饱和度检查
ValueError: Key d3 not in level Index(['d1', 'd2'], dtype='object')
这就说得通了。我通过的级别不足以描述键所指示的必要级别。如果我没有像上面那样传递任何内容,就会推断出级别(如文档中所述)。但除此之外,我还能如何利用这个论点来获得更好的效果呢?
如果我试试这个:
pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3']])
我得到了和上面一样的结果,但是当我给这些级别增加一个值的时候,
df = pd.concat([d1, d2, d3], keys=['d1', 'd2', 'd3'], levels=[['d1', 'd2', 'd3', 'd4']])
我最终得到了相同的数据帧,但是得到的 MultiIndex
有一个未使用的级别。
df.index.levels[0]
Index(['d1', 'd2', 'd3', 'd4'], dtype='object')
那么 level
参数的意义是什么? 我应该以不同的方式使用 keys
吗?
我用的是 Python 3.6和 Panda 0.22。