Python中实现指定格式DataFrame转换的正确方法(解决行重复)
DataFrame格式转换问题处理
问题描述
现有样例DataFrame结构如下:
- 列包含:
Country、Year、Series(取值为Rural_Rate或Urban_Rate)、Value - 同一
Country和Year对应两行数据,分别存储乡村和城镇的比率值
需要转换为以下格式:
- 同一
Country和Year合并为一行 - 新增
Rural_PopRate和Urban_PopRate列,分别对应原Series列中两个取值的Value值 - 整体行数因合并而减少
尝试了以下代码,但结果行仍重复:
print(PopRatesC.shape) PopRates = PopRatesC.copy() PopRates.rename(columns={'Value':'PopRate'}, inplace=True) PopRates=pd.get_dummies(data=PopRates, columns=['Series']) PopRates['Rural_PopRate']= PopRates['Series_Rural_Rate']*PopRates['PopRate'] PopRates['Urban_PopRate']= PopRates['Series_Urban_Rate']*PopRates['PopRate'] print(PopRates.shape) PopRates[416:422]
问题:生成的结果中,同一Country和Year仍保留两行,未实现合并。
正确处理方法
可以使用pivot系列方法直接完成列的转置与合并,以下是两种可靠方案:
方案1:使用pivot(适用于无重复索引的情况)
# 复制原数据避免修改源文件 PopRates = PopRatesC.copy() # 按Country和Year分组,将Series的不同取值转为单独列 result = PopRates.pivot(index=['Country', 'Year'], columns='Series', values='Value').reset_index() # 重命名列以匹配目标格式 result.rename(columns={ 'Rural_Rate': 'Rural_PopRate', 'Urban_Rate': 'Urban_PopRate' }, inplace=True) # 清除多余的列索引名称 result.columns.name = None
方案2:使用pivot_table(适用于存在重复索引的情况)
如果原数据中同一Country+Year+Series存在重复值,可通过聚合函数处理:
result = PopRates.pivot_table( index=['Country', 'Year'], columns='Series', values='Value', aggfunc='first' # 可根据需求替换为mean/sum等聚合方式 ).reset_index() # 重命名列 result.rename(columns={ 'Rural_Rate': 'Rural_PopRate', 'Urban_Rate': 'Urban_PopRate' }, inplace=True) result.columns.name = None
方案说明
pivot/pivot_table会自动将指定的index作为唯一行标识,把Series的不同取值转为新列,同时合并同一index的重复行reset_index用于将多级索引转为普通列,最后通过重命名列名完全匹配目标格式
内容的提问来源于stack exchange,提问作者user3087182
相关产品推荐
相关产品推荐

