假设我有一个包含两列的数据框,我希望根据由第一列的值确定的不同阈值过滤第二列的值。这些阈值是在字典中定义的,字典的键是第一列的值,字典的值是阈值。还会有一个默认值来匹配没有任何指定值的列。
例如:
thresholds_dict = {"A": 5, "B": 2, "C": 4, "default": 0}
sample_dataframe =
| Column1 | Column2 |
| A | 3 |
| A | 6 |
| B | 4 |
| B | 1 |
| C | 2 |
| D | 0 |
result_dataframe =
| Column1 | Column2 |
| A | 6 |
| B | 4 |
| D | 0 |
我一直在做以下事情来实现这个目标:
default = thresholds_dict["default"]
df[df.apply(lambda x: x["Column2"] >= thresholds_dict.get(x["Column1"], default), axis=1)]
然而,与使用单个阈值过滤所有DF的实现相比,执行时间增加了1000倍。有没有更好的方法来实现这一点,避免应用函数?
谢谢!
使用Series.map
,如果没有匹配得到缺失值,则将其替换为Series.fillna
:
thresholds_dict = {"A": 5, "B": 2, "C": 4, "default": 0}
default = thresholds_dict["default"]
df = df[df["Column2"] >= df["Column1"].map(thresholds_dict).fillna(default)]
print (df)
Column1 Column2
1 A 6
2 B 4
5 D 0