根据熊猫中多列中的值从数据框中选择行

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'])

不幸的是,这不起作用。任何人都可以建议一种方法来实现这样的事情吗?理想情况下,它应该足够笼统,以至于其中可能存在一组更复杂的条件,涉及andor,尽管我实际上并不需要这些条件。

【问题讨论】:

顺便说一句,我还在评论中将此链接到原始问题的已接受解决方案,以便其他人在访问原始问题时也可以找到它。 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 并训练自己使用 andor 而不是 &&|| 所以我想要做的事情必须看起来更像我的原创 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 感谢您的来信

以上是关于根据熊猫中多列中的值从数据框中选择行的主要内容,如果未能解决你的问题,请参考以下文章

根据熊猫中多列中的值从数据框中选择行

根据熊猫中多列中的值从数据框中选择行

根据熊猫中多列中的值从数据框中选择行

根据向量中的值从数据框中选择行

根据熊猫中多列的条件(最大值)替换列中的值

根据列值从熊猫数据框中提取行