求Python实现两个DataFrame的迭代组合计算方案
Pandas高效实现DataFrame关联计算方案
- 核心逻辑:对
df1每行的COL1,计算df2中Calc_1 - COL1*Calc_2的聚合结果(求和/计数),写入RESULT列 - 放弃两层for循环,Pandas提供了更高效的向量化方案,以下是具体实现:
第一步:构造可测试的示例数据
import pandas as pd import numpy as np # 示例df1:0-9数值组合表 df1 = pd.DataFrame({ 'COL1': np.arange(10), 'COL2': np.random.randint(1, 10, size=10), 'RESULT': np.nan }) # 示例df2:小时级时间序列表(模拟100条数据) df2 = pd.DataFrame({ 'Calc_1': np.random.rand(100), 'Calc_2': np.random.rand(100) })
第二步:求和操作实现
简洁版(apply方法)
适合中小数据量,代码直观易读:
# 对df1每行的COL1,计算对应聚合和 df1['RESULT'] = df1['COL1'].apply(lambda x: (df2['Calc_1'] - x * df2['Calc_2']).sum())
高效版(广播机制)
针对大数据量优化,完全规避循环,速度提升明显:
# 用numpy广播一次性计算所有行的结果矩阵 result_matrix = df2['Calc_1'].values[:, np.newaxis] - df1['COL1'].values * df2['Calc_2'].values[:, np.newaxis] # 按列求和(每列对应df1的一行) df1['RESULT'] = result_matrix.sum(axis=0)
第三步:计数操作实现(以结果>0的条目数为例)
简洁版(apply方法)
df1['RESULT'] = df1['COL1'].apply(lambda x: (df2['Calc_1'] - x * df2['Calc_2'] > 0).sum())
高效版(广播机制)
result_matrix = df2['Calc_1'].values[:, np.newaxis] - df1['COL1'].values * df2['Calc_2'].values[:, np.newaxis] df1['RESULT'] = (result_matrix > 0).sum(axis=0)
- 为什么不推荐循环?手动两层for循环效率极低,尤其是
df2数据量大时会严重拖慢程序;且容易因索引、赋值逻辑出错,Pandas的向量化方法内部做了性能优化,速度和稳定性都远优于循环。
内容的提问来源于stack exchange,提问作者Pepa Smolka
相关产品推荐
相关产品推荐

