Python 熊猫:在多个列上筛选

Python 熊猫:在多个列上筛选,python,pandas,filtering,Python,Pandas,Filtering,我在Pandas公司工作,我想对跨多个字段的数据帧应用多个过滤器 我正在处理另一个更复杂的数据框架,但我正在简化这个问题的内容。以下是示例数据帧的设置: dates = pd.date_range('20170101', periods=16) rand_df = pd.DataFrame(np.random.randn(16,4), index=dates, columns=list('ABCD')) 将一个过滤器应用于此数据框是有充分记录且简单的: rand_df.loc[lambda d

我在Pandas公司工作,我想对跨多个字段的数据帧应用多个过滤器

我正在处理另一个更复杂的数据框架,但我正在简化这个问题的内容。以下是示例数据帧的设置:

dates = pd.date_range('20170101', periods=16)
rand_df = pd.DataFrame(np.random.randn(16,4), index=dates, columns=list('ABCD'))
将一个过滤器应用于此数据框是有充分记录且简单的:

rand_df.loc[lambda df: df['A'] < 0]
rand_df.loc[lambda df:df['A']<0]
因为lambda看起来像一个简单的布尔表达式。很容易做到以下几点。这不起作用,因为它不是布尔表达式,而是可调用的。这些表达式中的多个不能像布尔表达式那样组合:

rand_df.loc[lambda df: df['A'] < 0 and df[‘B’] < 0]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-31-dfa05ab293f9> in <module>()
----> 1 rand_df.loc[lambda df: df['A'] < 0 and df['B'] < 0]
rand_df.loc[lambda df:df['A']<0和df['B']<0]
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1兰特测向位置[lambda测向:测向['A']<0和测向['B']<0]

我找到了两种方法来成功实现这一点。我将把它们添加到潜在答案中,这样您就可以直接将它们作为解决方案进行评论。但是,我想征求其他方法,因为我不确定这两种方法是否是筛选熊猫数据帧的标准方法。

以下是一种“连锁”使用“loc”操作的方法:

rand_df.loc[lambda df: df['A'] < 0].loc[lambda df: df['B'] < 0]
rand_df.loc[lambda df:df['A']<0]。loc[lambda df:df['B']<0]
rand_df[(rand_df.A<0)和(rand_df.B

PS你会在

中找到很多例子,这里有一种方法,包括编写一个方法来进行过滤。我确信有些过滤器会非常复杂,这种方法是最好的方法(这种情况并不复杂)。另外,当我使用Pandas时,我会写一个“for”loop,我觉得我做错了

def lt_zero_ab(df):
    result = []
    for index, row in df.iterrows():
        if row['A'] <0 and row['B'] <0:
            result.append(index)
    return result
rand_df.loc[lt_zero_ab]
def lt_zero_ab(df):
结果=[]
对于索引,df.iterrows()中的行:

如果行['A']使用
lambda
,则不要传递整个列

rand_df.loc[lambda x: (x.A < 0) & (x.B < 0)]
# Or
# rand_df[lambda x: (x.A < 0) & (x.B < 0)]

                   A         B         C         D
2017-01-12 -0.460918 -1.001184 -0.796981  0.328535
2017-01-14 -0.146846 -1.088095 -1.055271 -0.778120

取消重复:标记为重复的问题确实回答了我的问题。但是它没有这个问题那么清晰。这个问题有一些多余的上下文,例如数据是从CSV读入的。这是一个清晰的示例,您可以将代码直接粘贴到自己的REPL中,找到答案,然后发布它。在一个很短的时间内,这个问题比重复的被提名者有更多的答案。因此,我认为重新开放是有意义的。问题是完全相同的,而重复的答案是由大熊猫的创造者写的,所以我认为最好的办法是过滤数据文件。谢谢。谦卑地注意到我应该考虑S。特别重视Wes McKinney回答的Pandas问题。这一问题抓住了问题的本质:避免对封闭数据框架的多次引用
In [6]: rand_df[rand_df[['A','B']].lt(0).all(1)]
Out[6]:
                   A         B         C         D
2017-01-02 -0.701682 -1.224531 -0.273323 -1.091705
2017-01-05 -1.262971 -0.531959 -0.997451 -0.070095
2017-01-06 -0.065729 -1.427199  1.202082  0.136657
2017-01-08 -1.445050 -0.367112 -2.617743  0.496396
2017-01-12 -1.273692 -0.456254 -0.668510 -0.125507
def lt_zero_ab(df):
    result = []
    for index, row in df.iterrows():
        if row['A'] <0 and row['B'] <0:
            result.append(index)
    return result
rand_df.loc[lt_zero_ab]
rand_df.loc[lambda x: (x.A < 0) & (x.B < 0)]
# Or
# rand_df[lambda x: (x.A < 0) & (x.B < 0)]

                   A         B         C         D
2017-01-12 -0.460918 -1.001184 -0.796981  0.328535
2017-01-14 -0.146846 -1.088095 -1.055271 -0.778120
c1 = rand_df.A.values > 0
c2 = rand_df.B.values > 0
rand_df[c1 & c2]

                   A         B         C         D
2017-01-12 -0.460918 -1.001184 -0.796981  0.328535
2017-01-14 -0.146846 -1.088095 -1.055271 -0.778120