首先,让我踏上舞台。
我从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)
最后,我计算M
中klmn0
列的平均值,按L
列中的值进行分组:
In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]:
L
a -0.307671
b 0.451144
Name: M
现在,我的问题是, 如何从m0
子数据框的M
列中减去klmn1
,尊重L
中的值1}}列? (我的意思是m0['a']
从M
中klmn1
列的'a'
列中减去L
m0['b']
在M
列中,同样适用于klmn1
。)
可以想象这样做会以m0
klmn1
列中的值替换新值(在从klmn11
中减去值之后)。或者,可以想象以保持M
不变的方式执行此操作,而是生成具有更新的{{1}}列的新数据框{{1}}。 我对这两种方法感兴趣。
答案 0 :(得分: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
答案 1 :(得分:3)
选项#1:
df1.subtract(df2, fill_value=0)
选项#2:
df1.subtract(df2, fill_value=None)