【问题标题】:How to loop through a dataframe, create a new column and append values to it in python如何遍历数据框,创建一个新列并在python中将值附加到它
【发布时间】:2016-03-06 11:46:27
【问题描述】:

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

到目前为止我写的代码是这样的:

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 中的每个值,如果它在列表中至少出现 3 次,则将其附加到 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.xml 中最后一行的原始值。有人可以向我解释这里的问题是什么吗?

【问题讨论】:

  • 索引存在问题,通过查看您的代码,您尝试在每次迭代中添加一个名为“新列”的列,其值来自 Unique ...因此该列被覆盖并覆盖每个行...这就是为什么您与最后一行具有相同的值...

标签: python for-loop pandas dataframe


【解决方案1】:

您可以使用来自 Collections 的强大的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

【讨论】:

  • 谢谢,这很好用。但是你知道为什么我的代码不能按照我想要的方式工作/我应该改变什么才能让它工作吗?
  • 我强烈建议您使用此Counter,因为您将函数本身与数据帧上的循环解耦(便于对函数进行单元测试)并且......它也......更整洁/更容易理解:2 行。
猜你喜欢
  • 2021-09-27
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多