如何减去具有不同填充值的数据帧

时间:2019-07-01 10:09:32

标签: python pandas dataframe

我需要减去两个具有不同索引的数据框(当缺少一个值时会导致'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。

3 个答案:

答案 0 :(得分:3)

一种方法是将reindex df2设置fill_value0,然后再减去,然后用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