我有两个数据帧需要合并。
在n_df
中有几列,但相关的列是:
Statement Codes
Statement 1 CD.Ex-1
Statement 2 CD.Ex-2
Statement 3 CD.Ex-3
Statement 4 CD.Ex-4
Statement 5 CD.Ex-5
{
"Statement": ["Statement 1", "Statement 2", "Statement 3",
"Statement 4", "Statement 5",],
"Codes": ["CD.Ex-1", "CD.Ex-2", "CD.Ex-3","CD.Ex-4","CD.Ex-5",],
...
}
在p_df
我有3列:
Statement Codes Other_Codes
Statement A CD.Ex-A NC.a
Statement X CD.Ex-2 NC.b
Statement B CD.Ex-B NC.c
Statement 4 CD.Ex-4 NC.d
Statement C CD.Ex-C NC.e
{
"Statement": ["Statement A", "Statement X", "Statement B",
"Statement 4", "Statement C",],
"Codes": ["CD.Ex-A", "CD.Ex-2", "CD.Ex-B","CD.Ex-4","CD.Ex-C",],
"Other_Codes": ["NC.a", "NC.b", "NC.c","NC.d","NC.e",],
}
那么我需要做的是:
- 合并
Codes
上的数据帧 - 如果
n_df
(如CD.Ex-A)中不存在Codes
,则将Codes
(p_df)附加到Codes
(n_df) - 如果
n_df
中不存在Codes
(如CD.Ex-A),则将相关的Statement
(p_df)附加到Statement
(n_df)
到目前为止我已经完成了new_df = pd.merge(n_df, p_df, how='outer', on='Codes')
。然而,这样做有一些问题:我最终得到了两个Statement
列。为了减轻这种情况,我做了
s_df = p_df[['Other_Codes', 'Statement']]
p_df = p_df.drop('Statement', 1)
我的想法是,我可以做另一个合并,在Other_Codes
上添加Statement
回来?但我没能成功地做到这一点。我总是以两个Statement
列结束。
另一个问题(可能是相关的)是"语句"从每个表不一定对齐。在上面的例子中,代码CD.Ex-2的语句是n_df
中的Statement 2
和p_df
中的Statement X
。如果语句中有冲突,我需要n_df优先。
使用combine_first
将Statement (p_df)
的值更新为Statement (n_df)
。只有当n_df值为NaN时,才会更新值。
out = n_df.merge(p_df, on='Codes', how='outer', suffixes=('', '_'))
out = out.assign(Statement=out['Statement'].combine_first(out['Statement_']))
.drop(columns='Statement_')
输出:
>>> out
Statement Codes Other_Codes
0 1.0 CD.Ex-1 NaN
1 2.0 CD.Ex-2 NC.b
2 3.0 CD.Ex-3 NaN
3 4.0 CD.Ex-4 NC.d
4 5.0 CD.Ex-5 NaN
5 A CD.Ex-A NC.a
6 B CD.Ex-B NC.c
7 C CD.Ex-C NC.e