首先,讓我設置舞臺。如何從另一個數據框中減去一個數據框?
予先從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
成兩個dataframes,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)
最後,我計算列的平均值klmn0
,按照中的值柱:
In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0
Out[19]:
L
a -0.307671
b 0.451144
Name: M
現在,我的問題是,我怎麼能減去m0
從klmn1
子非數據幀的M
列,在L
列尊重的價值?(我的意思是m0['a']
會從每一行的M
列klmn1
,在L
列有'a'
,同樣爲m0['b']
扣除。)
可以想象在替換的方式這樣做值爲M
列klmn1
與新值(減去m0
後的值)。或者,可以想象這樣做的方式是使klmn1
保持不變,而是使用更新的M
列生成新的數據幀klmn11
。 我對這兩種方法都感興趣。
順便說一句,我很不滿意代碼我曾經把'klmn'分成'klmn0'和'klmn1'。具體來說,通過迭代'(True,False)'來理解兩個子數據框似乎很麻煩。是否有一些使用'groupby'對象'k0'直接提取子數據幀的索引表達式'klmn'或'klmn.ix [...]'? – kjo 2013-02-18 22:43:47