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

如何基于Date字段关联两个Pandas DataFrame并通过公式(df1-df2)/df2计算百分比差异生成最终DataFrame?

解决方案:按Date关联DataFrame并计算百分比差异

这里有一个可直接运行的Pandas解决方案,完美匹配你想要的结果:

import pandas as pd

# 创建示例df1
df1 = pd.DataFrame({
    'Date': ['2005-01-01', '2005-03-01', '', '', ''],
    'Student': ['Peter', 'Peter', 'John', 'Mary', 'Alan'],
    'Score1': [15, 110, 120, 90, 115],
    'Score2': [18, 330, 360, 210, 270]
})

# 创建示例df2
df2 = pd.DataFrame({
    'Date': ['2005-01-01', '2005-03-01'],
    'Student': ['Standard', 'Standard'],
    'Score1': [10, 100],
    'Score2': [20, 300]
})

# 步骤1:填充df1中缺失的Date值(向前填充,匹配上方的Date)
df1['Date'] = df1['Date'].replace('', pd.NA).ffill()

# 步骤2:按Date关联两个DataFrame,保留df1的所有行
merged_df = pd.merge(df1, df2, on='Date', suffixes=('', '_standard'))

# 步骤3:计算百分比差异 (df1 - df2)/df2
merged_df['Score1'] = (merged_df['Score1'] - merged_df['Score1_standard']) / merged_df['Score1_standard']
merged_df['Score2'] = (merged_df['Score2'] - merged_df['Score2_standard']) / merged_df['Score2_standard']

# 步骤4:整理列,去掉多余的标准列,并将重复的Date转为空字符串(匹配期望格式)
final_df = merged_df[['Date', 'Student', 'Score1', 'Score2']]
final_df['Date'] = final_df['Date'].where(final_df['Date'] != final_df['Date'].shift(), '')

# 打印结果(保留两位小数匹配示例)
print(final_df.round(2))

代码细节解释:

  • 填充Date缺失值:df1里John、Mary、Alan的Date是空值,用ffill()向前填充,让它们继承上方的2005-03-01,这样才能和df2的标准数据正确关联。
  • 关联DataFrame:用pd.merge()按Date字段匹配,suffixes参数用来区分原数据和标准数据的分数列,避免列名冲突。
  • 计算差异率:严格按照你给出的公式(df1值 - 标准值)/标准值计算,得到每个学生分数相对标准的百分比差异。
  • 还原格式:把重复的Date值转为空字符串,让输出和你期望的表格格式完全一致,最后用round(2)保留两位小数对齐示例结果。

运行代码后,你会得到和期望完全一致的最终DataFrame:

DateStudentScore1Score2
2005-01-01Peter0.5-0.1
2005-03-01Peter0.10.1
John0.20.2
Mary-0.1-0.3
Alan0.15-0.1

内容的提问来源于stack exchange,提问作者Alan Kam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:51:35