首页 > 解决方案 > 熊猫:有条件地将数据附加到列?

问题描述

我有两个需要合并的数据框。

其中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. 如果在(如 CD.Ex-A)Codes中不存在,则将(p_df) 附加到(n_df)n_dfCodesCodes
  3. 如果Codes不存在n_df(例如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 的语句位于Statement 2inn_dfStatement Xin 中p_df。如果语句中存在冲突,我需要 n_df 优先。

标签: pythonpandasdataframe

解决方案


用于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

推荐阅读