2017-03-10 30 views
1

在這個小數據幀:如何使用lambda表達式合併兩個計數值?

d1 = pd.read_csv('to_count.mcve.txt', sep='\t') 

pos M1   M2  F1 F2 
23 A,B,A,C,D A,C,B A  D 
24 A,B,B,C,B A,B,A B  D 
28 C,B,C,D,E B,C  E  D 

我想數多少在F1和F2的值都在M1和M2。作爲一個學習過程,我把它分解成了幾部分。

我可以這樣做:

d1_count = d1.apply(lambda x: x.loc[::].str.count(x.F1), 1) 

輸出:

 M1 M2 F1 F2 
    pos     
0 23 2 1 1 0 
1 24 3 1 1 1 
2 28 1 0 1 0 

而且,同樣

d2_count = d1.apply(lambda x: x.loc[::].str.count(x.F2), 1) 

與輸出:

 M1 M2 F1 F2 
    pos     
0 23 1 0 0 1 
1 24 3 1 1 1 
2 28 2 1 0 1 

但是,我想下面的最終預期輸出:

我想算F1和F2在一個線和輸出把由F2分離F1值用逗號

我們可以離開F1和F2放棄這不是一個大問題。

  M1 M2  
    pos     
0 23 2,1 1,0 
1 24 3,3 1,1 
2 28 1,2 0,1 

我試圖用加入,但失敗了,然後追加(其中din't工作,因爲我正好預期):

d3_count = d1.apply(lambda x: x.loc[::].str.count(x.F1).append(x.loc[::].str.count(x.F2)), 1) 

     M1 M2 F1 F2 M1 M2 F1 F2 
    pos         
0 23 2 1 1 0 1 0 0 1 
1 24 3 1 1 1 3 1 1 1 
2 28 1 0 1 0 2 1 0 1 

任何輸入與解釋,請。

謝謝,

+0

你是怎麼得到'3,3 1,1'的?它不是應該是'3,0,0'還是'3,0 1,0'? – DyZ

+0

哎呀,這應該是一個錯字。我將不得不糾正它 – everestial007

+0

@DYZ:其實沒有錯別字。我剛剛更新了** F1和F2 **的計數以使問題更清楚。你能看看嗎? – everestial007

回答

1

我會o這個;第一,使pos指數從所有進一步的操作消除它:

d1.set_index('pos', inplace=True) 

你的貓reset_index()如果您想以後。現在,找到計數,將它們轉換爲字符串,然後「添加」:

d1.apply(lambda x: x[['M1','M2']].str.count(x.F1), 1).astype('str') +\ 
"," +\ 
d1.apply(lambda x: x[['M1','M2']].str.count(x.F2), 1).astype('str') 
#  M1 M2 
#pos   
#23 2,1 1,0 
#24 3,0 1,0 
#28 1,1 0,0 
+0

這樣一個簡單的方法來做到這一點,但我無法想象** str **。非常感謝。 – everestial007