如何基于共同字段合并两个DataFrame并计算人口与死亡变化率
解决方案
1. 合并两个DataFrame
首先将长格式的df2转为宽格式,按州匹配对应的年度死亡数据后合并到df1,实现代码如下:
import pandas as pd # 将df2转为宽表,重命名列符合需求的命名规则 df2_pivot = df2.pivot(index='State', columns='Year', values='Death') df2_pivot = df2_pivot.rename(columns={ '2010': 'DeathYear2010', '2011': 'DY2011', '2012': 'DY2012', '2013': 'DY2013' }).reset_index() # 按州关联两个表,删除重复的State列 merged_df = pd.merge( left=df1, right=df2_pivot, left_on='GoArea', right_on='State', how='left' ).drop(columns='State')
运行后得到的merged_df就是符合要求的结果,保留了df1的所有原有字段,同时新增了对应年度的死亡数列,可直接用于后续计算。
2. 百分比变化计算与关联分析
你当前提供的示例数据仅覆盖2010-2013年,如果要计算2010-2016的变化,补充2014-2016的人口、死亡数据后,按照以下逻辑替换对应年份的字段即可。以下为通用计算逻辑:
- 百分比变化计算公式:(期末值 - 期初值) / 期初值 * 100%
- 关联分析可通过计算两个变化率的皮尔逊相关系数判断线性关联程度
实现代码如下:
# 示例为2010-2013的计算,替换为2016年的对应字段即可得到2010-2016的结果 # 计算人口百分比变化 merged_df['pop_change_pct'] = (merged_df['2013_popln'] - merged_df['2010_popln']) / merged_df['2010_popln'] * 100 # 计算死亡数百分比变化 merged_df['death_change_pct'] = (merged_df['DY2013'] - merged_df['DeathYear2010']) / merged_df['DeathYear2010'] * 100 # 计算二者的皮尔逊相关系数 corr_value = merged_df[['pop_change_pct', 'death_change_pct']].corr().iloc[0,1] print(f"人口变化率与死亡数变化率的相关系数为:{corr_value:.2f}")
结果解读参考:
- 相关系数接近1:二者强正相关,人口增长越快的区域死亡数增长越快
- 相关系数接近0:二者无线性关联
- 相关系数接近-1:二者强负相关,人口增长越快的区域死亡数增长越慢
内容的提问来源于stack exchange,提问作者nsardar
相关产品推荐
相关产品推荐

