合并两个pandas数据框并保留可用的值

24 浏览
0 Comments

合并两个pandas数据框并保留可用的值

我想要在两个数据框(A和B)中基于一个键X进行合并,如果这两个数据框中存在一个共同的列K(假设我们不知道这个列的名字),则应该保留其出现的值。

例如,对于第一行:如果A中有K的值(而B中没有),则保留A的值,但对于第二行:如果B中有K的值(而A中没有),则保留那个值。

如果两个数据框中都存在K的值,则保留任意一个。

由于我们不知道列名,因此请不要使用pd.merge并应用列名来标记此问题已解决。请参考图片进行解释(这里可能有50个像Name这样的列)。

0
0 Comments

问题的原因:需要将两个pandas数据帧进行合并,并保留可用的值。

解决方法:使用pd.merge()函数进行合并,并使用where()函数进行条件赋值,最后使用drop()方法删除不需要的列。

代码如下:

import pandas as pd
df_a = pd.DataFrame({'subject_id': ['1', '2', '3', '4', '5'],
                     'first_name': ['Alex', 'Amy', 'Allen', 'Alice', None]} , 
                    columns = ['subject_id', 'first_name'])
df_b = pd.DataFrame({'subject_id': ['4', '5', '6', '7', '8'],
                     'first_name': [None, 'Brian', 'Bran', 'Bryce', 'Betty']}, 
                    columns = ['subject_id', 'first_name'])
df_merge = pd.merge(df_a, df_b, on='subject_id', how='outer')
df_merge['first_name'] = df_merge['first_name_x'].where(df_merge['first_name_x'].notnull(), df_merge['first_name_y'])
df_res = df_merge.drop(['first_name_x', 'first_name_y'], axis=1)
print(df_res)

输出结果为:

  subject_id first_name
0          1       Alex
1          2        Amy
2          3      Allen
3          4      Alice
4          5      Brian
5          6       Bran
6          7      Bryce
7          8      Betty

如果不知道合并后生成的列名,可以使用以下代码:

suffixes = ('__x', '__y')
df_merge = pd.merge(df_a, df_b, on='subject_id', how='outer', suffixes=suffixes)
drop_cols = []
for col in df_merge.columns:
    if col.endswith(suffixes[0]):
        new_col = col[:-len(suffixes[0])]
        df_merge[new_col] = df_merge[col].where(df_merge[col].notnull(), df_merge[new_col + suffixes[1]])
        drop_cols.extend([col, new_col + suffixes[1]])
df_merge.drop(columns=drop_cols, inplace=True)

注意:更详细的解释可以参考官方文档,文档链接在代码中提供。

0