我需要减去两个具有不同索引的数据框(当缺少一个值时会导致'NaN'值),我想用不同的数字(填充值)替换每个数据框中的缺失值。 例如,假设我有df1和df2:
df1:
A B C
0 0 3 0
1 0 0 4
2 4 0 2
df2:
A B C
0 0 3 0
1 1 2 0
3 1 2 0
subtracted = df1.sub(df2)
:
A B C
0 0 0 0
1 -1 -2 4
2 NaN NaN NaN
3 NaN NaN NaN
我希望减法的第二行具有df1中第二行的值,而减法的第三行具有df1的值。
我希望-
减去:
A B C
0 0 0 0
1 -1 -2 4
2 4 0 2
3 5 5 5
我尝试使用sub_fill_value = 5的方法,但是在第2行和第3行中我都将得到0。
答案 0 :(得分:3)
一种方法是将reindex
df2
设置fill_value
到0
,然后再减去,然后用5
减去fillna
:>
ix = pd.RangeIndex((df1.index|df2.index).max()+1)
df1.sub(df2.reindex(ix, fill_value=0)).fillna(5).astype(df1.dtypes)
A B C
0 0 0 0
1 -1 -2 4
2 4 0 2
3 5 5 5
答案 1 :(得分:1)
我们必须在reindex
处获得相关索引。这样,我们可以使用sub
方法。
idxmin = df2.index.min()
idxmax = df2.index.max()
idx = np.arange(idxmin, idxmax+1)
df1.reindex(idx).sub(df2.reindex(idx).fillna(0)).fillna(5)
A B C
0 0.0 0.0 0.0
1 -1.0 -2.0 4.0
2 4.0 0.0 2.0
3 5.0 5.0 5.0
答案 2 :(得分:0)
我发现combine_first方法几乎可以满足我的需求:
df2.combine_first(df1).sub(df2, fill_value=0)
但仍然只产生:
A B C
0 0 0 0
1 0 0 0
2 4 0 2
3 0 0 0