如何合并/覆盖Pandas

时间:2016-06-20 18:11:11

标签: python pandas

我目前有两个CSV文件。其中一个(f1)在一列中有大约1000个唯一ID,另一个(f2)是一个在同一列中有~50个唯一ID的子集。

我想基于ID合并这些,但是当f1和f2具有相同名称的列时,我想选择f2列中的信息。当我运行当前的合并功能

merged = f1.merge(f2, on='KeyID', how='left');

具有相同名称的列生成两次,带有_x和_y版本。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

使用combine_first()

f2.set_index('KeyID').combine_first(f1.set_index('KeyID'))

答案 1 :(得分:1)

只需将f1附加到f2并删除所有重复项:

import pandas as pd

df1 = pd.DataFrame(data=[['A', 442],
                         ['B', 998],
                         ['C', 45],
                         ['F', 777]]
                   , columns=['KeyID', 'Info'])

df2 = pd.DataFrame(data=[['A', 12],
                        ['B', 77],
                        ['C', 6556],
                        ['D', 33],
                        ['E', 876]
                        ]
                  ,columns=['KeyID', 'Info'])


df_new = df1.append(df2, ignore_index=True).drop_duplicates(subset='KeyID')
print(df_new)

答案 2 :(得分:1)

Combine_first方法仅在左侧数据帧位置为空或为null时才采用右侧数据帧的元素。我认为问题的目的是选择正确的信息。为了这:         我们应该在两个数据帧之间建立标题交集。之后,删除该交叉点,合并键。最后没有重复的键,我们已经用右边的列“覆盖”了左边的列

hdr_left = set(left_df)
hdr_right = set(right_df)
common_hdr = hdr_left.intersection(hdr_right)
common_hdr.remove('primary_key')
common_hdr = list(common_hdr)
left_df_to_merge = left_df[left_df.columns.difference(common_hdr)]
merged_with_right_override = pd.merge(left_df_to_merge, right_df, on='primary_key', how='left')