为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')
运行后就能得到你想要的结果:
| City | 1994 | 1995 | 1996 | 1997 | 1998 |
|---|---|---|---|---|---|
| Rome | X | X | |||
| New York | |||||
| Paris | X | ||||
| Sidney | X | ||||
| London | X | ||||
| Madrid | X |
为什么这个方法有效?
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
相关产品推荐
相关产品推荐

