【问题标题】:Pandas: Check if row exists with certain values熊猫:检查是否存在具有某些值的行
【发布时间】:2014-09-05 19:43:06
【问题描述】:

我有一个像这样的二维(或更多)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

现在假设我有一个像 np.array([2,3]) 这样的 numpy 数组,并想检查 df 中是否有与我的数组内容匹配的行。这里的答案显然应该是正确的,但是例如。 np.array([1,2]) 应该返回 false,因为在 A 列中不存在同时在 B 列中包含 1 和 2 的行。

当然这很简单,但现在看不到。

【问题讨论】:

  • 行和列都有 1 , 2 那么你到底是什么意思没有?
  • 你试过类似 df.isin([1,2]) 的东西吗?它将输出您需要查找完全和部分匹配的行的布尔值
  • @JohnRuddell:但是没有一行在 A 列中包含 1,在 B 列中包含 2。我正在寻找类似于 SQL 中 WHERE 子句的语义。

标签: python pandas contains


【解决方案1】:

事实证明这真的很容易,以下是这里的工作:

>>> ((df['A'] == 2) & (df['B'] == 3)).any()
True
>>> ((df['A'] == 1) & (df['B'] == 2)).any()
False

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

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

【讨论】:

  • 解决方案很好,但是当你的数据很大时性能真的很差。试试这个:df.loc[(df['A'] == 2) & (df['B'] == 3)]。我在一个数据集上测试了我的解决方案的性能是 918 毫秒,而一个是 2.12 秒。
  • @Navy 您的解决方案无法评估为真/假,您需要对生成的 DF 做一些事情
  • @Navy 如果有办法评估布尔值,我很乐意将其视为答案
  • @fgblomqvist @Xgongiveittoya 添加any()all() 调用以接收布尔值。像这样:df.loc[(df['A'] == 2) & (df['B'] == 3)].any().all()
【解决方案2】:

更简单的方法是:

a = np.array([2,3])
(df == a).all(1).any()

【讨论】:

  • 这只有在维度相同的情况下才有效,对吧? IE。如果匹配应该基于五列DataFrame的前两列,这不会失败吗?
  • 这很简单。将df 替换为df[df.columns[:2]]
  • 以防万一您尝试使用不同的数据结构,也可以尝试(df == a).all(0).any()
【解决方案3】:

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

index_list = df[(df['A'] == 2)&(df['B'] == 3)].index.tolist()

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2023-02-25
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多