合并两个熊猫数据框并保持可用价值

时间:2019-09-13 13:57:15

标签: python pandas

我想在键X上合并两个数据帧(A和B),因此,如果在两个数据帧中都有一个具有相同名称的公用列K(假设我们不知道该列的名称),则应保持值

第1行的示例:如果A在K中有值(而不是B),则保留A的值,但在第2行中:如果B在K中有值(而不是A),则保留该值。 如果两者都存在,则请保留任何人。

我们不知道列名。因此,请不要使用pd.merge将其标记为已解决,然后再应用其列名称。参见图片以获取解释(此处可能有50列,如“名称”)

Like this

1 个答案:

答案 0 :(得分:0)

使用pd.merge()。参见以下示例:

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'])

使用pd.merge()对'subject_id'进行外部联接

df_merge = pd.merge(df_a, df_b, on='subject_id', how='outer')

您会得到:

subject_id first_name_x first_name_y
0          1         Alex          NaN
1          2          Amy          NaN
2          3        Allen          NaN
3          4        Alice         None
4          5         None        Brian
5          6          NaN         Bran
6          7          NaN        Bryce
7          8          NaN        Betty

您可以使用where从_x和_y列中有条件地分配一个值:

df_merge['first_name'] = df_merge['first_name_x'].where(df_merge['first_name_x'].notnull(), df_merge['first_name_y'])

使用.drop()方法删除 _x _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)

注意:有关更详细的解释,您可以参考官方的documentation,而here可以找到许多示例。