在pandas的操作员链接中是否可以使用列合并?例如,
df2 = df[(df['A'] < 4) & (df['B'] >= 4) & (df['C'] >= 4)]
这里,B&amp; B&amp; C具有相同的条件。即两列的值应> 4.当我重写时,
df2 = df[(df['A'] < 4) & (df['B','C'] >= 4)]
我收到错误。是否有一种有效的方法来编写此运算符链接?
先谢谢。
AP
答案 0 :(得分:2)
您可以按indexing with a list列名称选择多个列,然后using all
组合结果:
df2 = df[(df['A'] < 4) & (df[['B','C']] >= 4).all(axis='columns')]
请注意df[['B','C']]
中的双括号。这将返回df
的子数据框,其中列为B
和C
。
虽然它可能看起来像某种特殊的双括号语法,但它并不是特别的 - 评估遵循普通的Python规则 - 它只是内部和外部括号的含义不同。外括号表示我们正在编制索引df
。内括号用于形成列表['B','C']
。他们一起诱导Python调用df.__getitem__(['B','C'])
。
为什么df['B','C']
引发KeyError :
df['B','C']
相当于df[('B','C')]
。 df[('B','C')]
有一个非常好的
与df[['B','C']]
不同的含义。索引DataFrame时,Pandas
将元组('B','C')
解释为单个列标签。这是特别的
适用于MultiIndexed columns的DataFrame。在这种情况下,它会选择第一个MultiIndexed列级别等于B
且其第二列级别等于C
的列。由于您的DataFrame没有MultiIndexed列索引,也没有(特殊)名称('B','C')
的单个列,因此在评估df['B','C']
时会引发KeyError。
df['B','C']
未引发KeyError 的单索引DataFrame示例:
In [15]: df = pd.DataFrame(np.random.randint(10, size=(5,3)), columns=[('A','B'),('B','C'),('B','D')])
In [16]: df
Out[16]:
(A, B) (B, C) (B, D)
0 5 2 1
1 5 5 3
2 8 8 1
3 9 2 9
4 3 5 8
In [17]: df['B','C']
Out[17]:
0 2
1 5
2 8
3 2
4 5
Name: (B, C), dtype: int64
其中df['B','C']
未引发KeyError 的MultiIndexed DataFrame示例:
In [20]: df = pd.DataFrame(np.random.randint(10, size=(5,3)), columns=pd.MultiIndex.from_tuples([('A','B'),('B','C'),('C','D')]))
In [21]: df
Out[21]:
A B C
B C D
0 6 1 1
1 5 1 0
2 5 7 8
3 6 9 9
4 5 5 0
In [22]: df['B','C']
Out[22]:
0 1
1 1
2 7
3 9
4 5
Name: (B, C), dtype: int64