如何循环遍历数据框,创建一个新列并在python

时间:2015-12-02 09:36:36

标签: python for-loop pandas dataframe

我有以下问题。我有一个包含多个列的数据框,其中一列包含字符串作为值。我想遍历此列,更改这些值并将更改的值保存在新列中。

到目前为止我写的代码看起来像这样:

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中最后一行的原始值。有人可以向我解释这里的问题是什么吗?

1 个答案:

答案 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