我已经尝试了几个小时才能在此处找到答案,但是在我的特殊情况下我无法解决任何问题。我能找到的最接近的是:Apply multiple string containment filters to pandas dataframe using dictionary
我有一个交易价格的pd.Dataframe,其中包含以下几列:
df1 = database[['DealID',
'Price',
'Attribute A',
'Attribute B',
'Attribute C']]
属性分为以下类别:
filter_options = {
'Attribute A': ["A1","A2","A3","A4"],
'Attribute B': ["B1","B2","B3","B4"],
'Attribute C': ["C1","C2","C3"],
}
我想使用filter_options
的子集来过滤df1,该子集每个键具有 多个 个值:
filter = {
'Attribute A': ["A1","A2"],
'Attribute B': ["B1"],
'Attribute C': ["C1","C3"],
}
当字典中每个键只有一个值时,下面的方法可以正常工作。
df_filtered = df1.loc[(df1[list(filter)] == pd.Series(filter)).all(axis=1)]
但是,每个键具有多个值,我可以获得相同的结果吗?
谢谢!
答案 0 :(得分:1)
我认为您需要更改变量filter
,因为python保留了字,然后将list comprehension
与isin
和concat
一起使用了布尔掩码:
df1 = pd.DataFrame({'Attribute A':["A1","A2"],
'Attribute B':["B1","B2"],
'Attribute C':["C1","C2"],
'Price':[140,250]})
filt = {
'Attribute A': ["A1","A2"],
'Attribute B': ["B1"],
'Attribute C': ["C1","C3"],
}
print (df1[list(filt)])
Attribute A Attribute B Attribute C
0 A1 B1 C1
1 A2 B2 C2
mask = pd.concat([df1[k].isin(v) for k, v in filt.items()], axis=1).all(axis=1)
print (mask)
0 True
1 False
dtype: bool
df_filtered = df1[mask]
print (df_filtered)
Attribute A Attribute B Attribute C Price
0 A1 B1 C1 140