2013-02-18 111 views
3

首先,讓我設置舞臺。如何從另一個數據框中減去一個數據框?

予先從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,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) 

最後,我計算列的平均值klmn0,按照中的值柱:

In [19]: m0 = klmn0.groupby('L')['M'].mean(); m0 
Out[19]: 
L 
a -0.307671 
b 0.451144 
Name: M 

現在,我的問題是,我怎麼能減去m0klmn1子非數據幀的M列,在L列尊重的價值?(我的意思是m0['a']會從每一行的Mklmn1,在L列有'a',同樣爲m0['b']扣除。)

可以想象在替換的方式這樣做值爲Mklmn1與新值(減去m0後的值)。或者,可以想象這樣做的方式是使klmn1保持不變,而是使用更新的M列生成新的數據幀klmn11我對這兩種方法都感興趣。

+0

順便說一句,我很不滿意代碼我曾經把'klmn'分成'klmn0'和'klmn1'。具體來說,通過迭代'(True,False)'來理解兩個子數據框似乎很麻煩。是否有一些使用'groupby'對象'k0'直接提取子數據幀的索引表達式'klmn'或'klmn.ix [...]'? – kjo 2013-02-18 22:43:47

回答

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

選項#1:

df1.subtract(df2, fill_value=0) 

選項#2:

df1.subtract(df2, fill_value=None) 
相關問題