Man*_*udi 3 python list filter dataframe pandas
我有一个列列表,用于在来自列表的数据框中应用过滤器。过滤器值来自另一个列表。
早些时候,当列表是固定的时,我使用以下语句来完成工作:
df_result= df[(df[filterfieldList[0]] == filterValuesList[0]) & (df[filterfieldList[1]] == filterValuesList[1]) & (df[filterfieldList[2]] == filterValuesList[2])]
Run Code Online (Sandbox Code Playgroud)
但是随着时间的推移,我得到了一个新的要求,即过滤列表是动态的,我现在不知道如何做到这一点。就像有时,过滤器列表只有 2 个字段要过滤,有时是 3 或 5 个。在这种情况下如何进行过滤?
样本数据:
A B C D E
Project 1 Org_1 Directory MSTR Configuration
Project 1 Org_1 Directory MSTR Unable to Login
Project 1 Org_1 Desktop Software MSTR Configuration
Project 1 Org_1 Desktop Software MSTR Configuration]
Project 1 Org_1 Directory MSTR Unable to Login
Run Code Online (Sandbox Code Playgroud)
我认为需要对 create masks 进行列表理解,然后通过np.logical_and.reduce以下方式减少和最后过滤boolean indexing:
filterfieldList = ['A','B','E']
filterValuesList = ['Project 1', 'Org_1', 'Unable to Login']
tups = zip(filterfieldList, filterValuesList)
df_result = df[np.logical_and.reduce([(df[i] == j) for i, j in tups])]
print (df_result)
A B C D E
1 Project 1 Org_1 Directory MSTR Unable to Login
4 Project 1 Org_1 Directory MSTR Unable to Login
Run Code Online (Sandbox Code Playgroud)
编辑:
如果需要每行组合多个过滤器:
filterfieldList = ['A','B','E', 'E']
filterValuesList = ['Project 1', 'Org_1', 'Unable to Login', 'Configuration']
f = pd.DataFrame({'field': filterfieldList, 'val':filterValuesList})
f = f.groupby('field')['val'].apply(list)
print (f)
field
A [Project 1]
B [Org_1]
E [Unable to Login, Configuration]
Name: val, dtype: object
df_result = df[np.logical_and.reduce([(df[i].isin(j)) for i, j in f.items()])]
print (df_result)
A B C D E
0 Project 1 Org_1 Directory MSTR Configuration
1 Project 1 Org_1 Directory MSTR Unable to Login
2 Project 1 Org_1 Desktop Software MSTR Configuration
4 Project 1 Org_1 Directory MSTR Unable to Login
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |