如何使用多个条件过滤Pandas DataFrame?

时间:2018-07-31 17:29:01

标签: python pandas

我有一个如下的数据框对象

    Issue Type       Status  Reporter  Issue id
0   Eng Activity       Closed  snalanag     98908
1   Eng Activity  In Progress  snalanag     98452
2   Eng Activity       Closed  snalanag     98425
3     Dev-Defect       Closed  snalanag     97244
4     Dev-Defect       Closed  snalanag     96716
5   Eng Activity       Closed  snalanag     96698
6     Dev-Defect       Closed  snalanag     96696

现在,我想根据多个条件过滤数据。

条件将在字典中。 示例:{'Issue Type': 'Dev-Defect', 'Status': 'Closed', 'Reporter': 'snalanag'}

根据条件,我必须通过动态形成查询来过滤数据帧。请注意,我需要通过应用AND条件来过滤数据。

这意味着我必须立即对"Issue Type = Dev-Defect","Status = Closed","Reporter = snalanag"的给定数据帧应用过滤器。

类似的事情,但是应该根据条件字典动态生成。

print(df [(df [“ Issue key”] =='BUG-22212')&(df [“ Issue id”] == 97244)&(df [“ Status”] =='Closed') ])

2 个答案:

答案 0 :(得分:0)

您也许可以摆脱像这样的东西:

cond_dict = {'Issue Type': 'Dev-Defect', 'Status': 'Closed', 'Reporter': 'snalanag'}

final_mask = np.ones(len(orig_df)).astype(bool)

for this_cond in cond_dict:
    cond_dict = (final_mask ) & (orig_df[this_cond] == cond_dict[this_cond])

filtered_df = orig_df[final_mask]

答案 1 :(得分:0)

您可以在.loc中使用numpy.logical_and来容纳多个逻辑表达式。由于numpy.logical_and只能有2个表达式,因此reduce函数可用于使其与多个表达式一起使用。说明:Numpy logical_or for more than two arguments

对于您的情况,我们可以使用类似的内容:

df.loc[np.logical_and.reduce((df["Issue Type"]=="Dev-Defect", df["Status"]=="Closed", df["Reporter"]=="snalanag"))]

希望这会有所帮助!

编辑

由于您使用的是条件字典,因此可能有帮助:

conditions = {'Issue Type': 'Dev-Defect', 'Status': 'Closed', 'Reporter': 'snalanag'}
df.loc[np.logical_and.reduce(list(map(lambda x: df[x]==conditions[x], conditions.keys())))]