我有两个像这样的数据帧
import pandas as pd
import numpy as np
np.random.seed(0)
df1 = pd.DataFrame(np.random.randint(10, size=(5, 4)), index=list('ABCDE'), columns=list('abcd'))
df2 = pd.DataFrame(np.random.randint(10, size=(2, 4)), index=list('CE'), columns=list('abcd'))
a b c d
A 5 0 3 3
B 7 9 3 5
C 2 4 7 6
D 8 8 1 6
E 7 7 8 1
a b c d
C 5 9 8 9
E 4 3 0 3
df2的索引始终是df1索引的子集,列名相同.
我想创建第三个数据帧df3 = df1 – df2.如果一个人这样做,就得到了
a b c d
A NaN NaN NaN NaN
B NaN NaN NaN NaN
C -3.0 -5.0 -1.0 -3.0
D NaN NaN NaN NaN
E 3.0 4.0 8.0 -2.0
我不希望输出中的NA,而是df1的相应值.有没有一种聪明的方式来使用,例如在df2中未包含的行中,df1的值是否为fillna?
解决方法是仅减去所需的行,如:
sub_ind = df2.index
df3 = df1.copy()
df3.loc[sub_ind, :] = df1.loc[sub_ind, :] - df2.loc[sub_ind, :]
这给了我想要的输出
a b c d
A 5 0 3 3
B 7 9 3 5
C -3 -5 -1 -3
D 8 8 1 6
E 3 4 8 -2
但也许有一种更直接的方法来实现这一目标?
最佳答案 如果使用sub方法而不是 – ,则可以传递填充值:
df1.sub(df2, fill_value=0)
Out:
a b c d
A 5.0 0.0 3.0 3.0
B 7.0 9.0 3.0 5.0
C -3.0 -5.0 -1.0 -3.0
D 8.0 8.0 1.0 6.0
E 3.0 4.0 8.0 -2.0