如果索引匹配,则添加行值



我有两个行数不同的数据框,为了简单起见,我将使用一个示例。

DF1

1   2   3
AA_ABC 1.0 1.0 1.0
AA_ABC NaN NaN NaN
AB_ABC 1.0 1.0 1.0
AC_ABC 1.0 1.0 1.0
AC_ABC NaN NaN NaN
AC_ABC NaN NaN NaN
....  ... ... ...

DF2

1   2    3
AA_ABC .13 0.0  -.3
AB_ABC .24 0.0  .4
AC_ABC 0.0 -.07 .02
AD_ABC 0.0 0.0  0.0
....  ... ...  ...

我想做的是搜索DF1和DF2索引匹配,如果有匹配,我想将DF2的整行添加到DF1,但当DF1中的一行具有NaN值时跳过,因为DF1中可以有重复的没有附加值,我确实需要保留在最终结果。

想要的结果

1    2    3
AA_ABC 1.13 1.0  0.7
AA_ABC NaN  NaN  NaN
AB_ABC 1.24 1.0  1.4
AC_ABC 1.0  .93  1.02
AC_ABC NaN  NaN  NaN
AC_ABC NaN  NaN  NaN
....  ... ... ...

编辑:DF1有非唯一的索引id,我需要保持在适当的位置,因此groupby也是我不能执行的。

编辑:我进一步尝试了一下,试图获得一个总索引,然后在组合索引 上添加数据帧。
final_index = np.concatenate([df1.index, df2.index])
temp_result = (df1.reindex(final_index)+ df2.reindex(final_index))

,但收到一个值错误ValueError:不能重新索引轴上的重复标签

编辑:也许迭代是关键仍在尝试解决它

所以我开始编写代码来复制您的dataframe

df_1 = pd.read_csv(StringIO(''',1,2,3
AA_ABC,1.0,1.0,1.0
AA_ABC,NaN,NaN,NaN
AB_ABC,1.0,1.0,1.0
AC_ABC,1.0,1.0,1.0
AC_ABC,NaN,NaN,NaN
AC_ABC,NaN,NaN,NaN'''), sep=',', index_col=0)

df_2 = pd.read_csv(StringIO(''',1,2,3
AA_ABC,.13,0.0,-.3
AB_ABC,.24,0.0,.4
AC_ABC,0.0,-.07,.02
AD_ABC,0.0,0.0,0.0'''), sep=',', index_col=0)

然后我把它们合并成一个dataframe

df = df_1.merge(df_2, left_index=True, right_index=True)

给了:


1_x 2_x 3_x 1_y     2_y      3_y
AA_ABC  1.0 1.0 1.0 0.13    0.00    -0.30
AA_ABC  NaN NaN NaN 0.13    0.00    -0.30
AB_ABC  1.0 1.0 1.0 0.24    0.00    0.40
AC_ABC  1.0 1.0 1.0 0.00    -0.07   0.02
AC_ABC  NaN NaN NaN 0.00    -0.07   0.02
AC_ABC  NaN NaN NaN 0.00    -0.07   0.02

然后对列求和,然后选择期望的列

df['1'] = df['1_x'] + df['1_y']
df['2'] = df['2_x'] + df['2_y']
df['3'] = df['3_x'] + df['3_y']
df[['1', '2', '3']]

结果


1    2   3
AA_ABC  1.13 1.00   0.70
AA_ABC  NaN   NaN   NaN
AB_ABC  1.24  1.00  1.40
AC_ABC  1.00  0.93  1.02
AC_ABC  NaN   NaN   NaN
AC_ABC  NaN   NaN   NaN

您可以注意到,我没有忽略NaN的行,我只是包括它们,因为NaN加上某些东西也是Nan

最新更新