如何基于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:
| Date | Student | Score1 | Score2 |
|---|---|---|---|
| 2005-01-01 | Peter | 0.5 | -0.1 |
| 2005-03-01 | Peter | 0.1 | 0.1 |
| John | 0.2 | 0.2 | |
| Mary | -0.1 | -0.3 | |
| Alan | 0.15 | -0.1 |
内容的提问来源于stack exchange,提问作者Alan Kam
相关产品推荐
相关产品推荐

