You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:45:27