如何按列值匹配将pandas DataFrame指定列与Series相乘
Pandas按列值匹配Series做乘法运算实现方案
问题定义
现有pandas DataFrame对象df与Series对象s,定义如下:
import pandas as pd df = pd.DataFrame( [[0,0,10],[0,1,11],[1,0,12],[1,1,13],[2,0,14],[2,1,15]], columns=['a','b','val'] ) s = pd.Series([2,3])
两个对象的基础结构:
df原始数据:
| 行索引 | a | b | val |
|---|---|---|---|
| 0 | 0 | 0 | 10 |
| 1 | 0 | 1 | 11 |
| 2 | 1 | 0 | 12 |
| 3 | 1 | 1 | 13 |
| 4 | 2 | 0 | 14 |
| 5 | 2 | 1 | 15 |
s原始数据:
| 行索引 | 值 |
|---|---|
| 0 | 2 |
| 1 | 3 |
计算规则
将s的索引值与df的b列值做匹配,取匹配到的s值乘以对应行的val列值,预期val列从原始的[10, 11, 12, 13, 14, 15]转换为[20, 33, 24, 39, 28, 45]。
实现方法
推荐方法:map映射(效率最高、写法最简洁)
直接用b列映射s的取值,拿到每行对应的乘数后和val列做乘法即可,不需要依赖MultiIndex、GroupBy等复杂逻辑:
df['val'] = df['val'] * df['b'].map(s)
执行后打印df可得到完全符合预期的结果:
a b val 0 0 0 20 1 0 1 33 2 1 0 24 3 1 1 39 4 2 0 28 5 2 1 45
备选方法:replace匹配
逻辑和map一致,写法如下:
df['val'] = df['val'] * df['b'].replace(s)
常见无效尝试原因说明
直接调用.mul()方法时,pandas默认按行索引对齐做广播运算,而非按指定列的值匹配,因此会出现空值或计算错位;用.apply()逐行判断匹配的写法运行效率远低于向量化的map操作,写法也更冗余。
内容的提问来源于stack exchange,提问作者konstanze
相关产品推荐
相关产品推荐

