熊猫:检查行是否存在某些值

Rob*_*bin 26 python contains pandas

我有一个二维(或更多)pandas DataFrame,如下所示:

>>> import pandas as pd
>>> df = pd.DataFrame([[0,1],[2,3],[4,5]], columns=['A', 'B'])
>>> df
   A  B
0  0  1
1  2  3
2  4  5
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个numpy数组,np.array([2,3])并想检查是否有任何行df匹配我的数组的内容.答案显然应该是正确的,例如.np.array([1,2])应返回false,因为A列中没有1,B列中没有2.

当然这很容易,但现在看不到.

Rob*_*bin 43

原来这很简单,以下是这里的工作:

>>> ((df['A'] == 2) & (df['B'] == 3)).any()
True
>>> ((df['A'] == 1) & (df['B'] == 2)).any()
False
Run Code Online (Sandbox Code Playgroud)

也许有人提出了一个更好的解决方案,允许直接传入数组和匹配列的列表.

请注意,括号周围df['A'] == 2不是可选的,因为&运算符绑定与运算符一样强==.

  • 解决方案很好,但是当您的数据很大时,性能确实很差。试试这个:df.loc [(df ['A'] == 2)&(df ['B'] == 3)]。我在一个数据集上进行了测试,我的解决方案的性能为918毫秒,一个为2.12 s。 (3认同)
  • @Navy你的解决方案无法评估为真/假,你需要对结果 DF 做一些事情 (2认同)
  • @fgblomqvist @Xgongiveittoya 添加 `any()` 和 `all()` 调用以接收布尔值。像这样:`df.loc[(df['A'] == 2) & (df['B'] == 3)].any().all()` (2认同)

acu*_*ner 11

一种更简单的方法是:

a = np.array([2,3])
(df == a).all(1).any()
Run Code Online (Sandbox Code Playgroud)

  • 这是微不足道的。用 `df[df.columns[:2]]` 替换 `df` (3认同)

spa*_*row 8

如果您还想返回匹配发生的索引:

index_list = df[(df['A'] == 2)&(df['B'] == 3)].index.tolist()
Run Code Online (Sandbox Code Playgroud)