Pandas:有条件地向列追加数据?



我有两个数据帧需要合并。

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",],    
}

那么我需要做的是:

  1. 合并Codes上的数据帧
  2. 如果n_df(如CD.Ex-A)中不存在Codes,则将Codes(p_df)附加到Codes(n_df)
  3. 如果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 2p_df中的Statement X。如果语句中有冲突,我需要n_df优先。

使用combine_firstStatement (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

相关内容

  • 没有找到相关文章

最新更新