2017-03-10 26 views
1

在這個小數據幀:如何計算熊貓數據框中單元的項目數量(或長度)?

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

     M1   M2   F1 
     A,B,A,C,D A,C,B,C,B A 
     A,B,B,C,B A,B,A  B 
     C,B,C,D,E B,C   E 

步驟01:

我想數有多少F1值都在M1和M2

我可以做:

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

輸出:

 M1 M2 F1    
     2 1 1 
     3 1 1 
     1 0 1 

步驟02:但我想除以2的計數,如果原始細胞的長度是3個以上(不含逗號)。

說明:

  • 所有M1中的值具有長度超過3個,第一個M2具有長度大於3這麼多,統計了這些需求(除以2)來改變。

  • M1中的第一個值是A,B,A,C,D

  • 的F1值是A和有2個「A」在M1其中使用.str.count(x.F1)
  • 由於A,B,A,C,D長度大於3我現在計數更改計數(除以2),結果爲1.
  • 我想爲所有列自動執行此操作,因爲會有很多列。

最終預期輸出是:

 M1  M2     
    1  0.5 
    1.5 1 
    0.5 0 

任何建議。

+0

什麼是「細胞」,它的「長度」是什麼? –

+0

您可以使用總和... –

+0

熊貓數據框中的每個單元格都是「列和行」的交集。第一個單元格是數據「A,B,A,C,D」 – everestial007

回答

1

看起來您的M1列中的「單元格」是用逗號分隔的字符串。首先將其轉換爲列表而不是字符串可能會更容易,因此您的操作是有意義的。像這樣:

df['M1_list'] = df['M1'].apply(lambda x: x.split(",")) 

現在你有一個名爲M1_list的列,其中每個條目都有一個列表。現在您可以再次使用.apply()來獲取您想要的號碼。

df['F1_count'] = df.apply(lambda x: x['M1_list'].count(x['F1']), axis=1) 

但是,這只是給你的項目的數量從F1M1_list計數。要獲得條件:「如果你有超過3項除以2計數」你可以做的是另.apply

df['F1_count'] = df.apply(lambda x: x['F1_count']/2 if len(x['M1']) >= 3 else x['F1_count'], axis=1) 

當然你也可以將其組合到一個單一的.apply聲明,如果你想要的。但是,如果分離複雜的操作,它會使代碼更容易閱讀。你可以結合這一種方式是使用輔助功能,而不是使用lambda

def compute_F1(row): 
    M1_list = row['M1'].split(",") 
    f1_count = M1_list.count(row['F1']) 
    if (len(M1_list) >= 3): 
     return f1_count/2 
    else: 
     return f1_count 

然後應用函數每一行:

df['F1_count'] = df.apply(lambda x: compute_F1(x), axis=1) 

而且你應該有你的結果。

+0

感謝您的回答。但是,我試圖將此應用於存在大量列的我的數據。所以,我不想指定特定的列(如'df ['M1']')。我試圖用df [::]和其他幾種方法解決問題,但無法完成。有什麼建議麼。 – everestial007

+0

你可以寫一個for循環來循環所有列。爲了將來的參考,如果這樣的事情對你的解決方案很重要,你應該在原始文章中提及它。 – mprat

+0

是的,我的壞。實際上,我能夠使用** df_count = df.apply(lambda x:x.loc [::]。str.count(x.F1),1)**來對所有列進行計數,但是我不能只需插入條件。嘗試applymap然後變得最糟糕。我在這裏拉我的頭髮,哈哈 – everestial007