2015-12-02 150 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行。 –

相关问题