首先,让我简单介绍一下背景。
我将以一个名为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
拆分成两个数据框 klmn0
和 klmn1
,根据 '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
分割成klmn0
和klmn1
的代码不满意。具体来说,似乎很麻烦地使用推导式迭代(True, False)
来获取两个子数据框。是否有一些索引表达式klmn[...]
或klmn.ix[...]
,可以直接使用groupby
对象k0
提取子数据框呢? - kjo