根据熊猫中多列中的值从数据框中选择行
Posted
技术标签:
【中文标题】根据熊猫中多列中的值从数据框中选择行【英文标题】:Selecting rows from a Dataframe based on values in multiple columns in pandas 【发布时间】:2015-10-23 17:35:42 【问题描述】:这个问题非常与another 相关,我什至会使用这个问题上非常有用的公认解决方案中的示例。以下是已接受解决方案的示例(归功于 unutbu):
import pandas as pd
import numpy as np
df = pd.DataFrame('A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2)
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
产量
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
但是,如果我想挑选出同时包含 'foo' 和 'one' 的所有行怎么办?这里是第 0 行和第 6 行。我的尝试是尝试
print(df.loc[df['A'] == 'foo' and df['B'] == 'one'])
不幸的是,这不起作用。任何人都可以建议一种方法来实现这样的事情吗?理想情况下,它应该足够笼统,以至于其中可能存在一组更复杂的条件,涉及and
和or
,尽管我实际上并不需要这些条件。
【问题讨论】:
顺便说一句,我还在评论中将此链接到原始问题的已接受解决方案,以便其他人在访问原始问题时也可以找到它。df.query("A=='foo' and B=='one'")
是另一种方式
【参考方案1】:
您的代码只需要进行很小的更改:将and
更改为&
(并添加括号以正确排序比较):
In [104]: df.loc[(df['A'] == 'foo') & (df['B'] == 'one')]
Out[104]:
A B C D
0 foo one 0 0
6 foo one 6 12
您必须使用&
的原因是这将对数组进行逐元素比较,而and
期望比较两个表达式,其计算结果为 True 或 False。
同样,当您想要or
比较时,您可以在这种情况下使用|
。
【讨论】:
谢谢@joris。我来自 Matlab 并训练自己使用and
和 or
而不是 &&
和 ||
所以我想要做的事情必须看起来更像我的原创 Matlab 思维。无论如何,我很感谢您的解释,并且您的回答也适用于分配。【参考方案2】:
您可以通过对代码进行微小改动来做到这一点:
print(df[df['A'] == 'foo'][df['B'] == 'one'])
输出:
A B C D
0 foo one 0 0
6 foo one 6 12
【讨论】:
请注意,只要您只选择数据就可以了,但是一旦您想为此类选择分配新值,这种链式索引将不再起作用。因此,我建议使用&
并一次性使用索引。
非常感谢这位乔治。虽然您的回答和 joris 的回答都足以满足我的目的,但我接受了 joris 的回答,因为他解释了为什么 and
不起作用并且他的回答也允许分配。不过,我很感激你的建议,并相应地提出了建议。
@Shane 我很高兴Shane。同意,他用 and/& 解释了你的情况。顺便说一句,我也首先看到了这个操作数的差异,所以我也学到了一些新东西。所以没关系,感谢您的支持。 :)
@joris 感谢您的来信以上是关于根据熊猫中多列中的值从数据框中选择行的主要内容,如果未能解决你的问题,请参考以下文章