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

6

首先,让我简单介绍一下背景。

我将以一个名为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

接下来,我将 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)

最后,我按照L列的值对klmn0中的M列进行分组,并计算均值:
In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]: 
L
a   -0.307671
b    0.451144
Name: M

现在,我的问题是,如何从klmn1子数据框的M列中减去m0,同时保留L列中的值?(我指的是对于L列中有'a'的每一行,在klmn1中的M列中都会减去m0['a'],对于'm0['b']'也是同样的情况。)
可以想象以一种方式来完成这个任务,即用新值(减去m0的值)替换klmn1的M列中的值。另外,也可以想象以一种方式来完成这个任务,即不更改klmn1,而是生成一个更新后的klmn11数据框,其中包含一个更新的M列。(我对这两种方法都感兴趣。)

顺便提一下,我对用来将 klmn 分割成 klmn0klmn1 的代码不满意。具体来说,似乎很麻烦地使用推导式迭代 (True, False) 来获取两个子数据框。是否有一些索引表达式 klmn[...]klmn.ix[...],可以直接使用 groupby 对象 k0 提取子数据框呢? - kjo
2个回答

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

5

选项1:

df1.subtract(df2, fill_value=0) 

选项 #2:
df1.subtract(df2, fill_value=None) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接