我有两个行数不同的数据框,为了简单起见,我将使用一个示例。
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