我处于需要将几列乘以与间隔相对应的值的情况。
我正在使用 Pandas,但我使用 for 循环来获取值,如下所示。
我认为有比这更好的方法,有人可以给我一些建议吗?
样本:
import pandas as pd
d = {
5: 5,
4: 7,
3: 2,
2: -4,
1: -5,
}
def mul(value):
if value < 1: return value * 0.01
elif 5 < value: return value * 20
for k, v in d.items():
if value <= k:
val = value * v
break
return val
a = [
{'a': 5, 'b': 10, 'c': 2},
{'a': 4, 'b': 0.5, 'c': 4},
{'a': 3.5, 'b': 1.5, 'c': 5},
{'a': 2.1, 'b': 5, 'c': 6},
{'a': 0.1, 'b': 1, 'c': 7},
]
df = pd.DataFrame(a)
a = []
b = []
for i in df.values:
a.append(mul(i[0]))
b.append(mul(i[1]))
df['a1'] = a
df['b1'] = b
print(df.head())
"""
a b c a1 b1
0 5.0 10.0 2.0 25.000 200.000
1 4.0 0.5 4.0 20.000 0.005
2 3.5 1.5 5.0 17.500 7.500
3 2.1 5.0 6.0 10.500 25.000
4 0.1 1.0 7.0 0.001 5.000
"""
代码
使用切割
出去:
已编辑问题的更新答案
自从问题被编辑以来,逻辑发生了很大变化,您无法轻松地将操作矢量化。值的映射在很大程度上取决于函数的内部逻辑
mul
,而这里取决于字典中键的顺序。如果没有矢量化,你可以将代码简化为:
输出:
最初问题的原始答案
这正是
numpy.searchsorted
正在做的事情,只需将其与整数数组索引结合起来:注意: 中的键
d
必须已排序。此外,这使用side='left'
的默认参数searchsorted
。输出:
要合并到原始 DataFrame 中,请执行以下
join
操作:输出:
中间(匹配值的索引
k
):