我有以下问题。我有一个包含几列的数据框,其中一列包含字符串作为值。我想遍历此列,更改这些值并将更改后的值保存在新列中。
到目前为止,我编写的代码如下所示:
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。然后,完成的列表是sorted
和set()
,因此列表中的所有对象都是唯一的,最后再次以逗号连接到字符串。然后,我想将此唯一值列表添加到新列中,该列与更改后的值所源自的行值的索引位置相同。例如:
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中最后一行的原始值相对应。有人可以告诉我这里的问题是什么吗?
您可以使用Counter
Collections中的功能强大:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句