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

为Pandas DataFrame新增列并合并重复行

用Pandas正确合并新旧城市事件数据

你的问题核心是要基于城市列合并两个数据集,同时保留所有城市并正确填充缺失值,之前用append导致重复行是因为它只是简单追加行,不会匹配相同城市;而merge没得到理想结果大概率是用了默认的inner连接(只保留两边都有的城市),试试下面的方法:

解决方案:使用外连接(Outer Join)的merge方法

首先先定义你的两个数据集:

import pandas as pd

# 原有1994-1997年数据
df_old = pd.DataFrame({
    'City': ['Rome', 'New York', 'Paris', 'Sidney'],
    '1994': ['X', pd.NA, pd.NA, pd.NA],
    '1995': [pd.NA, pd.NA, 'X', pd.NA],
    '1996': [pd.NA, pd.NA, pd.NA, pd.NA],
    '1997': [pd.NA, pd.NA, pd.NA, pd.NA]
})

# 新增1998年数据
df_new = pd.DataFrame({
    'City': ['Rome', 'Sidney', 'London', 'Madrid'],
    '1998': ['X', 'X', 'X', 'X']
})

然后用merge方法,指定外连接和连接键为City:

df_final = pd.merge(df_old, df_new, on='City', how='outer')

运行后就能得到你想要的结果:

City19941995199619971998
RomeXX
New York
ParisX
SidneyX
LondonX
MadridX

为什么这个方法有效?

  • how='outer':会保留两个数据集里的所有城市,不管它只在旧数据、只在新数据还是两边都有,不会丢失任何行
  • on='City':指定以城市名称作为匹配键,相同城市的行自动合并成一行,避免了append导致的重复问题
  • 缺失值自动填充:新加入的城市(London、Madrid)在1994-1997列会自动填充为NaN(或pd.NA),旧数据里没有1998年记录的城市(New York、Paris)在1998列也会自动填充为NaN

另一种方法:用join基于索引连接

如果你习惯用索引操作,也可以把City设为索引后用join:

# 设置City为索引
df_old_indexed = df_old.set_index('City')
df_new_indexed = df_new.set_index('City')

# 外连接后重置索引
df_final = df_old_indexed.join(df_new_indexed, how='outer').reset_index()

这个方法和merge的效果完全一致,只是实现方式不同。

为什么之前的append不行?

df.append()(注意:Pandas 2.0+已经弃用这个方法,推荐用pd.concat)的逻辑是直接追加行,它不会去检查两行的城市是否相同,所以Rome和Sidney会被当成不同的行重复添加,这显然不符合我们“合并同城市数据”的需求。

内容的提问来源于stack exchange,提问作者M R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:52:40