用向量化方法替代列表推导式为大型DataFrame构建新特征
问题描述
现有如下pandas DataFrame:
import pandas as pd data = pd.DataFrame({'group':['A', 'A', 'B', 'C', 'C', 'B'], 'value':[0.2, 0.21, 0.54, 0.02, 0.001, 0.19]})
需要构建三个新特征,目标输出如下:
pd.DataFrame({'group':['A', 'A', 'B', 'C', 'C', 'B'], 'value':[0.2, 0.21, 0.54, 0.02, 0.001, 0.19], 'group_A':[0.2, 0.21, 0,0,0,0], 'group_B':[0,0,0.54, 0, 0, 0.19], 'group_C':[0,0,0,0.02, 0.001,0]})
当前通过以下循环方式实现,但面对大型数据集效率不足,寻求更高效的向量化实现方案:
for g in data.group.unique(): tmp= [0 if j==g else i for i, j in zip(data.value, data.group)] data['group_{}'.format(g)]=tmp
最优向量化实现方案
直接利用pandas的**get_dummies**结合向量化乘法实现,完全避免循环,效率远高于逐行遍历,尤其适配大型数据集:
# 生成分组的one-hot编码矩阵 dummies = pd.get_dummies(data['group'], prefix='group') # 将one-hot矩阵与value列做元素级乘法,得到对应分组的特征值 group_features = dummies.mul(data['value'], axis=0) # 合并原数据与新生成的特征列 result = pd.concat([data, group_features], axis=1)
方案优势
- 极致效率:基于numpy底层的向量化运算,比Python循环快数倍甚至数十倍,处理百万级数据时差距尤为显著
- 代码简洁:自动识别所有唯一分组,无需手动遍历,避免遗漏或人为错误
- 内存友好:利用数组广播机制完成运算,无需额外创建大量临时对象
验证输出与目标完全一致:
print(result) # 输出: group value group_A group_B group_C 0 A 0.20 0.20 0.00 0.00 1 A 0.21 0.21 0.00 0.00 2 B 0.54 0.00 0.54 0.00 3 C 0.02 0.00 0.00 0.02 4 C 0.00 0.00 0.00 0.00 5 B 0.19 0.00 0.19 0.00
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

