【发布时间】:2016-12-31 05:54:03
【问题描述】:
首先,让我来设置舞台。
我从 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
接下来我根据“K”列中的值将klmn分成两个数据框klmn0和klmn1:
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)
最后,我计算klmn0 中M 列的平均值,按L 列中的值分组:
In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]:
L
a -0.307671
b 0.451144
Name: M
现在,我的问题是,如何从 klmn1 子数据框的 M 列中减去 m0,同时尊重 L 列中的值?(我的意思是m0['a']被从klmn1中每一行的M列中减去,L列中有'a',m0['b']也是如此。)
可以想象这样做的方式是将klmn1 的M 列中的值替换为新值(在从m0 中减去该值之后)。或者,可以想象以一种保持klmn1 不变的方式执行此操作,而是生成一个新的数据框klmn11,并更新M 列。 我对这两种方法都感兴趣。
【问题讨论】:
-
顺便说一句,我对用于将
klmn拆分为klmn0和klmn1的代码不满意。具体来说,诉诸于对(True, False)进行迭代的理解来获取两个子数据帧似乎很麻烦。是否有一些索引表达式klmn[...]或klmn.ix[...]直接使用groupby对象k0来提取子数据帧?
标签: pandas