操作员链接在pandas数据帧中

时间:2017-05-27 11:42:46

标签: python-3.x pandas

在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

1 个答案:

答案 0 :(得分:2)

您可以按indexing with a list列名称选择多个列,然后using all组合结果:

df2 = df[(df['A'] < 4) & (df[['B','C']] >= 4).all(axis='columns')]

请注意df[['B','C']]中的双括号。这将返回df的子数据框,其中列为BC。 虽然它可能看起来像某种特殊的双括号语法,但它并不是特别的 - 评估遵循普通的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