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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:50:36