如何通过相等的索引和列名将空数据框与另一个填充的数据框合并/合并?

FAB*_*eng 6 python merge dataframe pandas

我想结合两个dataframesdataframe假设其中一个Empty_DF是空的,并且大小很大(320列乘240行),索引和列名只是整数。另一个ROI_DF较小,并且填充,并且在特定位置匹配索引和列名。

我已尝试使用pandas.merge问题中建议的功能;但是,它将只是将列追加到空dataframe Empty_DF而不替换值。

Empty_DF = pd.DataFrame({'a':[0,0,0,0,0,0],
            'b':[0,0,0,0,0,0], 'b':[0,0,0,0,0,0]}, index=list('abcdef'))

print (Empty_DF)

 ROI_DF= pd.DataFrame({'a':range(4),
            'b':[5,6,7,8]}, index=list('abce'))

 print(ROI_DF)
   a  b  c
a  0  0  0
b  0  0  0
c  0  0  0
d  0  0  0
e  0  0  0
f  0  0  0
Run Code Online (Sandbox Code Playgroud)

在此示例中,这足够了,因为dataframe很小,pandas.fillna可以使用带有pandas.drop 的选项。有没有更有效的方法来将此优化为更大dataframes

df3 = pd.merge(Empty_DF, ROI_DF, how='left', left_index=True, 
right_index=True, suffixes=('_x', ''))
df3['a'].fillna(df3['a_x'], inplace=True)
df3['b'].fillna(df3['b_x'], inplace=True)
df3.drop(['a_x', 'b_x'], axis=1, inplace=True)

print(df3)
 a  b c
a  0  5 0
b  1  6 0
c  2  7 0
d  0  0 0
e  3  8 0
f  0  0 0
Run Code Online (Sandbox Code Playgroud)

Erf*_*fan 3

这是 的完美案例DataFrame.update,它与索引对齐

Empty_DF.update(ROI_DF)
Run Code Online (Sandbox Code Playgroud)

输出

print(df3)

     a    b  c
a  0.0  5.0  0
b  1.0  6.0  0
c  2.0  7.0  0
d  0.0  0.0  0
e  3.0  8.0  0
f  0.0  0.0  0
Run Code Online (Sandbox Code Playgroud)

请注意update,正如文档中引用的那样,它已经到位:

使用另一个 DataFrame 中的非 NA 值进行适当修改。

这意味着您的原始数据框将被新值更新。为了防止这种情况,请使用:

df3 = Empty_DF.copy()
df3.update(ROI_DF)
Run Code Online (Sandbox Code Playgroud)