我有一个如下的数据框对象
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') ])
答案 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())))]