python - 用字典值替换 pandas 数据框列中的字符串并执行评估的字典键
问题描述
我有一个熊猫数据框:
df = pd.DataFrame({'col1': ['3 a, 3 ab, 1 b',
'4 a, 4 ab, 1 b, 1 d',
np.nan] })
和一本字典
di = {'a': 10.0,
'ab': 2.0,
'b': 1.5,
'd': 1.0,
np.nan: 0.0}
使用字典中的值,我想像这样评估数据框行:
3*10.0 + 3*2.0 + 1*1.5 给我一个看起来像这样的最终输出:
pd.DataFrame({'col1': ['3 a, 3 ab, 1 b',
'4 a, 4 ab, 1 b, 1 d',
'np.nan'], 'result': [37.5,
50.5,
0] })
所以,到目前为止,我只能用 '+' 替换 ','
df['col1'].str.replace(',',' +').str.split(' ')
解决方案
理解
from functools import reduce
from operator import mul
def m(x): return di.get(x, x)
df.assign(result=[
sum(
reduce(mul, map(float, map(m, s.split())))
for s in row.split(', ')
) for row in df.col1
])
col1 result
0 3 a, 3 ab, 1 b 37.5
1 4 a, 4 ab, 1 b, 1 d 50.5
2 np.nan 0.0
推荐阅读
- recursion - Scheme中的中间递归函数值
- java - 如果 DatePicker 在 AlertDialog 内,则不会在 EditText 单击上显示
- c# - 为什么实例构造函数首先运行?
- r - R - 将 excel 读入源结构中的数据框并获取读取的行数
- prolog - 试图理解 Prolog 错误:existence_error
- c# - Parallel.For 运行 100 次然后停止?
- java - 如何避免每个线程创建不同的池?
- redis - AWS Elasticache redis 安全和限制
- xaml - 带有 CornerRadius 的框架不会变成圆形
- jsf - 如何在 JSF 复合组件中强制执行 cc:attribute 的类型?