我想在键X上合并两个数据帧(A和B),因此,如果在两个数据帧中都有一个具有相同名称的公用列K(假设我们不知道该列的名称),则应保持值
第1行的示例:如果A在K中有值(而不是B),则保留A的值,但在第2行中:如果B在K中有值(而不是A),则保留该值。 如果两者都存在,则请保留任何人。
我们不知道列名。因此,请不要使用pd.merge将其标记为已解决,然后再应用其列名称。参见图片以获取解释(此处可能有50列,如“名称”)
答案 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可以找到许多示例。