2015-12-02 26 views
1

我有以下問題。我有一個數據框有幾列,其中一個包含字符串作爲值。我想遍歷這一列,更改這些值並將更改的值保存在新列中。如何遍歷一個數據框,創建一個新列並在python中追加值

到目前爲止,我已經寫的代碼看起來是這樣的:

def get_classes(x):  
    for index, string in df['column'].iteritems(): 
     listi = string.split(',') 
     Classes=[] 

     for value in listi: 
      count=listi.count(value) 
      if count >= 3: 
       Classes.append(value) 

     Unique=(',').join(sorted(list(set(Classes)))) 
     df['NewColumn']=Unique 


End.apply(get_classes) 

它通過循環的df['column']行,在每個,(創建一個名爲LISTI列表)分割字符串,並創建一個空的list稱爲類。 然後,它計算listi中的每個值並將其追加到類中,如果它在列表中至少出現三次。完成的列表然後是sortedset(),以便列表中的所有對象都是唯一的,最後再以逗號將它們連接到一個字符串。然後我想將這個唯一的值列表添加到新列中,與索引位置相同,索引位置與更改後的值的行值相同。作爲例子:

df 
    column NewColumn 
0 A,A,A,C A 
1 C,B,C,C C 
2 B,B,B,B B 

我的代碼似乎當我做print Unique,而不是df['NewColumn']=Unique到正常工作,因爲它然後打印所有的值轉換。然而,如果我像我的例子那樣執行代碼,那麼數據幀的NewColumn將完全填充相同的值,這似乎對應於df中最後一行的原始值。有人可以向我解釋這裏的問題是什麼?

+0

上有索引問題,通過看你的代碼,你試圖在每次迭代添加一個名爲「新列」與獨特價值列.. 。因此,這一列被覆蓋並覆蓋每一行...這就是爲什麼你從最後一行得到相同的值... –

回答

2

您可以使用強大的Counter從類別:

from collections import Counter 

foo = lambda x: ','.join(sorted([k for k,v in Counter(x).iteritems() if v>=3])) 

df['new'] = df['column'].str.split(',').map(foo) 


#In [33]: df 
#Out[33]: 
# column NewColumn new 
#0 A,A,A,C   A A 
#1 C,B,C,C   C C 
#2 B,B,B,B   B B 
+0

謝謝,這工作正常。但是,你是否知道爲什麼我的代碼無法按照我希望的方式工作/我應該改變它的工作方式? –

+0

我強烈建議你使用這個'Counter',因爲你將函數本身從數據框上的循環中解耦出來(對函數進行單元測試很簡單),而且......也更簡單易懂:2行。 –

相關問題