熊猫:检查是不是存在具有某些值的行

Posted

技术标签:

【中文标题】熊猫:检查是不是存在具有某些值的行【英文标题】: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 子句的语义。 【参考方案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()

【讨论】:

以上是关于熊猫:检查是不是存在具有某些值的行的主要内容,如果未能解决你的问题,请参考以下文章

删除熊猫数据框中具有特定值的行[重复]

熊猫数据框检查索引是不是存在于多索引中

`错误:不平衡括号`同时检查项目是不是存在于熊猫数据框中

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

从字典中添加具有映射值的新熊猫列[重复]

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?