我想结合两个dataframes
。一个dataframe
,假设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
在此示例中,这已经足够了,因为dataframe
很小,并且可以使用带有 pandas.drop 的pandas.fillna
选项。有没有更有效的方法将其优化为更大的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
这是DataFrame.update
的完美情况,它在索引上对齐
Empty_DF.update(ROI_DF)
输出
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
请注意,update
已到位,如文档引用的那样:
使用另一个数据帧中的非 NA 值就地修改。
这意味着原始数据帧将按新值进行更新。要防止这种情况,请使用:
df3 = Empty_DF.copy()
df3.update(ROI_DF)
您可以使用update
:
Empty_DF.update(ROI_DF)
输出:
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
或loc
:
Empty_DF.loc[ROI_DF.index, ROI_DF.columns] = ROI_DF
输出:
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
在您的情况下reindex_like
yourdf=ROI_DF.reindex_like(Empty_DF).fillna(0)
a b c
a 0.0 5.0 0.0
b 1.0 6.0 0.0
c 2.0 7.0 0.0
d 0.0 0.0 0.0
e 3.0 8.0 0.0
f 0.0 0.0 0.0