如何用嵌套For循环实现两个DataFrame变量相乘生成新DataFrame?
解决方案
核心思路
不用For循环,利用Pandas的矢量化操作和数据格式转换实现高效匹配计算,步骤如下:
步骤1:构造示例数据(替换为你的真实数据即可)
import pandas as pd import numpy as np # df_A:全年每日乘法系数,这里生成2022-2025年的每日数据 dates = pd.date_range(start='2022-01-01', end='2025-12-31', freq='D') df_A = pd.DataFrame({ 'date': dates, 'multiplication_factor': np.random.uniform(0.003, 0.005, len(dates)) }) # df_B:5个类别2022-2025年度量 df_B = pd.DataFrame({ 'category': ['cat1', 'cat2', 'cat3', 'cat4', 'cat5'], '2022': [1000, 1200, 800, 1500, 900], '2023': [1100, 1300, 850, 1600, 950], '2024': [1200, 1400, 900, 1700, 1000], '2025': [1300, 1500, 950, 1800, 1050] })
步骤2:处理日期与格式转换
- 从df_A的日期中提取年份,用于和df_B的年度列匹配
- 将df_B的宽格式转换为长格式,让每个「类别-年份」对应一条年度量记录
# 提取df_A的年份 df_A['year'] = df_A['date'].dt.year # 转换df_B为长格式 df_B_long = df_B.melt( id_vars='category', var_name='year', value_name='annual_volume' ) # 把年份列转为整数类型,确保匹配时类型一致 df_B_long['year'] = df_B_long['year'].astype(int)
步骤3:匹配数据并计算每日量
通过年份合并两个数据集,直接对整列进行乘法运算(矢量化操作,比循环效率高很多):
# 按年份合并数据 merged_df = pd.merge(df_A, df_B_long, on='year', how='left') # 计算每日量:年度量 × 每日乘法系数 merged_df['daily_volume'] = merged_df['annual_volume'] * merged_df['multiplication_factor']
步骤4:整理结果(可选)
根据需求调整列顺序或排序:
# 调整列顺序,方便查看 result_df = merged_df[['category', 'date', 'year', 'annual_volume', 'multiplication_factor', 'daily_volume']] # 按类别和日期排序 result_df = result_df.sort_values(by=['category', 'date']).reset_index(drop=True)
关键说明
- 矢量化操作:Pandas的列运算会自动遍历所有行,无需手动写For循环,代码更简洁且性能更优
- 格式转换:宽转长是实现多类别-年度匹配的核心,避免了循环遍历每个类别和年份的繁琐操作
内容的提问来源于stack exchange,提问作者stuggling_grad
相关产品推荐
相关产品推荐

