熊猫:检查是不是存在具有某些值的行
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()
【讨论】:
以上是关于熊猫:检查是不是存在具有某些值的行的主要内容,如果未能解决你的问题,请参考以下文章