我有一个模型为score
和order_amount_bucket
的pandas DataFrame。订单金额存储区中有8个垃圾箱,每个垃圾箱都有不同的阈值。我想过滤框架并生成一个布尔掩码,显示通过哪些行。
我可以通过详尽列出条件来做到这一点,但我觉得必须有一种更Python的方式来做到这一点。
到目前为止,我是如何完成此工作的一个小示例(为简单起见,仅提供3个垃圾箱)。
import pandas as pd
sc = 'score'
amt = 'order_amount_bucket'
example_data = {sc:[0.5, 0.8, 0.99, 0.95, 0.8,0.8],
amt: [1, 2, 2, 2, 3, 1]}
thresholds = [0.7, 0.8, 0.9]
df = pd.DataFrame(example_data)
# the exhaustive method to create the pass mask
# is there a better way to do this part?
pass_mask = (((df[amt]==1) & (df[sc]<thresholds[0]))
|((df[amt]==2) & (df[sc]<thresholds[1]))
|((df[amt]==3) & (df[sc]<thresholds[2]))
)
pass_mask.values
>> array([ True, False, False, False, True, False])
答案 0 :(得分:2)
您可以将thresholds
隐藏到dict
并使用Series.map
:
d = dict(enumerate(thresholds, 1))
# d: {1: 0.7, 2: 0.8, 3: 0.9}
pass_mark = df['order_amount_bucket'].map(d) > df['score']
[出]
print(pass_mark.values)
array([ True, False, False, False, True, False])