如何在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中的每个值进行计数,如果它在列表中至少出现三次,则将其附加到Classes中。完成的列表是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中最后一行的原始值。有人能向我解释一下这里的问题是什么吗?

您可以使用Collections:中的powerfull 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

最新更新