2016-02-09 62 views
1

最近我問這是回答的問題 - How do I add conditionally to a selection of cells in a pandas dataframe column when the the column is a series of lists?,但我相信有我以前沒有考慮的新問題。矢量化解決方案,有條件的數據框選擇

在下面的數據幀我需要兩個條件,導致變化d列。在d列中的每個值是一個list

  • 其中a == b,d中的最後一個整數加1。
  • 其中a != b,整數列表被擴展並且值1被插入list列的末尾d列中。

    a  b  c   d   
    On  On  [0]   [0,3]  
    On  Off  [0]   [0,1] 
    On  On  [0]   [2]   
    On  On  [0]   [0,4,4]   
    On  Off  [0]   [0] 
    
  • 其結果,數據幀將是這樣的:

    a  b  c  d  
    On  On  [0]  [0,4]  
    On  Off  [0]  [0,1,1]  
    On  On  [0]  [3] 
    On  On  [0]  [0,4,5] 
    On  Off  [0]  [0,1] 
    

我知道這可以使用pd.Series.apply方法來完成結合的預定義的功能或使用的lambda然而數據幀由100000行組成,我希望可以存在針對這兩種情況的向量化解決方案。

+1

存儲非標值作爲數據元素是不明智的,通常你失去了矢量化方法爲NP和熊貓Access已追加到沒有向量化方法一個矢量化的列表 – EdChum

+0

我有一種感覺,可能是這種情況。作爲熊貓的新用戶,捕獲這些數據的更爲典型的方式是什麼?數據幀大約有50萬次更新,每次都會在col'a'和col''中得到不同的結果。如果「a == b」,則計數增加,如果「a!= b」需要開始新的計數。 – orgelzyklus

回答

0

作爲Edchum says,vecorised溶液可以是有問題的。與apply定製functions

一個非矢量化的解決方案:

df['e'] = df['d'] 

def exten(lst): 
    return lst + [1] 

def incre(lst): 
    lst[-1] = lst[-1] + 1 
    return lst 

df.loc[df.a != df.b, 'd'] = df.e.apply(exten) 
df.loc[df.a == df.b, 'd'] = df.e.apply(incre) 
df = df.drop('e', axis=1) 
print df 
    a b c   d 
0 On On [0]  [0, 4] 
1 On Off [0] [0, 1, 1] 
2 On On [0]  [3] 
3 On On [0] [0, 4, 5] 
4 On Off [0]  [0, 1] 
+0

嗨,非常感謝。這與我目前使用的幾乎完全相同(儘管你的功能更加優雅!),但是由於行數的原因,它的使用時間有點過長。 – orgelzyklus

+0

是的,我試圖找到更好的解決方案。但問題是:列'c'是長度爲'1'的'list'? – jezrael

+0

是的,這是感謝。 – orgelzyklus