Pandas DataFrame合并避免后缀,如何实现指定结果输出?
问题描述
我有两个列名相同的Pandas DataFrame,执行内连接后重复列会自动添加_x、_y后缀,但我需要实现的是:保留df1的所有行,同时用df2中相同id的行替换df1对应行的内容,另外新增id为4、列值全为'A'的行,最终得到指定输出。
给出的DataFrame定义如下:
import pandas as pd df1 = pd.DataFrame({'id': [1, 2, 3, 5, 6, 7], 'column1': ['A', 'A', 'A', 'A', 'A', 'A'], 'column2': ['A', 'A', 'A', 'A', 'A', 'A']}) df2 = pd.DataFrame({'id': [5, 6, 7], 'column1': ['B', 'B', 'B'], 'column2': ['B', 'B', 'B']})
df1的内容:
id column1 column2 1 A A 2 A A 3 A A 5 A A 6 A A 7 A A
df2的内容:
id column1 column2 5 B B 6 B B 7 B B
期望输出:
id column1 column2 1 A A 2 A A 3 A A 4 A A 5 B B 6 B B 7 B B
解决方案
可以通过以下步骤实现需求:
用df2替换df1中相同id的行:
使用combine_first方法,先将df2和df1都设置id为索引,再执行合并操作,这样df2的行会覆盖df1中同id的行,同时保留df1的所有行。新增id=4的行:
创建包含id=4的单行DataFrame,将其与前面处理后的结果合并,最后重置索引并按id排序,得到最终结果。
完整代码如下:
import pandas as pd # 定义原始DataFrame df1 = pd.DataFrame({'id': [1, 2, 3, 5, 6, 7], 'column1': ['A', 'A', 'A', 'A', 'A', 'A'], 'column2': ['A', 'A', 'A', 'A', 'A', 'A']}) df2 = pd.DataFrame({'id': [5, 6, 7], 'column1': ['B', 'B', 'B'], 'column2': ['B', 'B', 'B']}) # 用df2覆盖df1同id的行 combined = df2.set_index('id').combine_first(df1.set_index('id')).reset_index() # 新增id=4的行 new_row = pd.DataFrame({'id': [4], 'column1': ['A'], 'column2': ['A']}) result = pd.concat([combined, new_row], ignore_index=True).sort_values('id').reset_index(drop=True) print(result)
执行后输出结果:
id column1 column2 0 1 A A 1 2 A A 2 3 A A 3 4 A A 4 5 B B 5 6 B B 6 7 B B
内容的提问来源于stack exchange,提问作者Manic Daniel
相关产品推荐
相关产品推荐

