如何从另一个数据框中减去一个?

kjo*_*kjo 5 pandas

首先,让我踏上舞台.

我从pandas数据框开始klmn,看起来像这样:

In [15]: klmn
Out[15]: 
    K  L         M   N
0   0  a -1.374201  35
1   0  b  1.415697  29
2   0  a  0.233841  18
3   0  b  1.550599  30
4   0  a -0.178370  63
5   0  b -1.235956  42
6   0  a  0.088046   2
7   0  b  0.074238  84
8   1  a  0.469924  44
9   1  b  1.231064  68
10  2  a -0.979462  73
11  2  b  0.322454  97
Run Code Online (Sandbox Code Playgroud)

接下来,我分成klmn两个数据帧,klmn0klmn1根据"K"列中的值:

In [16]: k0 = klmn.groupby(klmn['K'] == 0)
In [17]: klmn0, klmn1 = [klmn.ix[k0.indices[tf]] for tf in (True, False)]
In [18]: klmn0, klmn1
Out[18]: 
(   K  L         M   N
0  0  a -1.374201  35
1  0  b  1.415697  29
2  0  a  0.233841  18
3  0  b  1.550599  30
4  0  a -0.178370  63
5  0  b -1.235956  42
6  0  a  0.088046   2
7  0  b  0.074238  84,
     K  L         M   N
8   1  a  0.469924  44
9   1  b  1.231064  68
10  2  a -0.979462  73
11  2  b  0.322454  97)
Run Code Online (Sandbox Code Playgroud)

最后,我计算M列的平均值,按列中klmn0的值分组L:

In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]: 
L
a   -0.307671
b    0.451144
Name: M
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,如何m0从子数据帧的M列中减去klmn1,尊重L列中的值? (我的意思是m0['a']被从减去M每行的列klmn1'a'L列,同样的m0['b'].)

可以想象这样做的方式是用新值替换M列中klmn1的值(在减去值之后m0).或者,可以想象以klmn1不变的方式执行此操作,而是生成klmn11具有更新M列的新数据帧. 我对这两种方法都很感兴趣.

Zel*_*ny7 6

如果将klmn1数据帧的索引重置为L列的索引,那么您的数据帧将自动将索引与您从中减去的任何序列对齐:

In [1]: klmn1.set_index('L')['M'] - m0
Out[1]:
L
a    0.777595
a   -0.671791
b    0.779920
b   -0.128690
Name: M
Run Code Online (Sandbox Code Playgroud)


Soh*_*han 5

选项1:

df1.subtract(df2, fill_value=0) 
Run Code Online (Sandbox Code Playgroud)

选项#2:

df1.subtract(df2, fill_value=None) 
Run Code Online (Sandbox Code Playgroud)