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

如何基于两个DataFrame的条件生成并填充第三个DataFrame?

解决方案:基于DF1、DF2自动化填充DF3(Python + Excel实现)

一、需求梳理

核心计算逻辑:

  • DF3的每个单元格值 = DF1对应技术类型的百分比值 × DF2对应技术类型的年度值 × 730(固定系数)
  • 需覆盖多技术类型、2023-2030全日期范围,同时包含手动构建DF3的方法

二、Python实现方案

1. 手动构建DF3(搭建基础结构)

假设技术类型包含Geothermal、Solar、Wind等,日期范围为2023年1月至2030年12月:

import pandas as pd

# 生成月度日期序列(每月第一天)
dates = pd.date_range(start='2023-01-01', end='2030-12-01', freq='MS')
# 定义技术类型列表
tech_types = ['Geothermal', 'Solar', 'Wind']
# 创建空DF3:日期为索引,技术类型为列
df3 = pd.DataFrame(index=dates, columns=tech_types)
# 添加年份辅助列(用于匹配DF2的年度数据)
df3['Year'] = df3.index.year

2. 自动化填充逻辑

假设DF1结构:Technology列 + Percentage列(如Geothermal对应0.7);DF2结构:Technology列 + 2023、2024...2030列(年度数值)

# 将DF2转为"技术-年份"长格式,简化匹配逻辑
df2_long = df2.melt(id_vars='Technology', var_name='Year', value_name='Annual_Value')
df2_long['Year'] = df2_long['Year'].astype(int)

# 合并DF1与转换后的DF2,得到每个技术+年份的计算因子
factor_df = pd.merge(df1, df2_long, on='Technology')

# 遍历DF3行,匹配因子计算并填充
for idx, row in df3.iterrows():
    current_year = row['Year']
    current_factors = factor_df[factor_df['Year'] == current_year]
    for tech in tech_types:
        pct = current_factors[current_factors['Technology'] == tech]['Percentage'].values[0]
        annual_val = current_factors[current_factors['Technology'] == tech]['Annual_Value'].values[0]
        df3.loc[idx, tech] = pct * annual_val * 730

# 可选:移除年份辅助列
df3 = df3.drop('Year', axis=1)

三、Excel实现方案

1. 手动构建DF3结构

  • 步骤1:在Sheet3(DF3)的A列生成日期序列:A2输入2023/1/1,下拉填充至2030/12/1,设置单元格格式为Jan-23样式。
  • 步骤2:在B1、C1、D1等单元格输入技术类型(如Geothermal、Solar、Wind)。
  • 步骤3:添加年份辅助列(如Z列),Z2输入公式=YEAR(A2),下拉填充,用于提取年份匹配DF2数据。

2. 自动化填充公式

假设DF1在Sheet1:A列=Technology,B列=Percentage;DF2在Sheet2:A列=Technology,B-I列=2023-2030年度值。

在DF3的B2(对应Jan-23的Geothermal)输入以下公式,向右、向下填充即可:

=VLOOKUP(B$1, Sheet1!$A:$B, 2, FALSE) * INDEX(Sheet2!$B:$I, MATCH(B$1, Sheet2!$A:$A, 0), MATCH($Z2, Sheet2!$1:$1, FALSE)) * 730

公式说明:

  • VLOOKUP(B$1, Sheet1!$A:$B, 2, FALSE):从DF1匹配对应技术的百分比
  • INDEX(Sheet2!$B:$I, MATCH(B$1, Sheet2!$A:$A, 0), MATCH($Z2, Sheet2!$1:$1, FALSE)):从DF2匹配对应技术+年份的年度值
  • 最后乘以固定系数730

内容的提问来源于stack exchange,提问作者Chetan Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56