我有如下数据:
NAME ETHNICITY_RECAT TOTAL_LENGTH 3LETTER_SUBSTRINGS
joseph fr 14 jos,ose,sep,eph
ann en 16 ann
anne ir 14 ann,nne
tom en 18 tom
tommy fr 16 tom,omm,mmy
ann ir 19 ann
... more rows
3LETTER_SUBSTRINGS值是一个字符串,它捕获NAME变量的所有3个字母的子字符串。我想将其聚合到一个列表中,每个行之间都附加一个逗号分隔的项目,并将其视为一个列表项目。如下:
ETHNICITY_RECAT TOTAL_LENGTH 3LETTER_SUBSTRINGS
min max mean <lambda>
fr 2 26 13.22 [jos,eph,tom,oom,mmy,...]
en 3 24 11.92 [ann,...]
ir 4 23 12.03 [ann,nne,ann,...]
我使用以下代码来“完成”它:
aggregations = {
'TOTAL_LENGTH': [min,max,'mean'],'3LETTER_SUBSTRINGS': lambda x: list(x),}
self.df_agg = self.df.groupby('ETHNICITY_RECAT',as_index=False).agg(aggregations)
问题在于整个字符串“ ann,anne”被认为是最终列表中的单个列表项,而不是将每个字符串都视为单个列表项,例如“ ann”,“ anne”。
我希望看到子字符串的最高频率,但是现在,当我运行以下代码时,我得到了整个字符串的频率(而不是单个的3个字母的子字符串):
from collections import Counter
x = self.df_agg_eth[self.df_agg_eth['ETHNICITY_RECAT']=='en']['3LETTER_SUBSTRINGS']['<lambda>']
x_list = x[0]
c = Counter(x_list)
我明白了:
[('jos,eph',19),('ann,nee',5),...]
不是我想要的:
[('jos',('ose',('sep',23),('eph',('ann',15),('nee',...]
我尝试过:
'3LETTER_SUBSTRINGS': lambda x: list(i) for i in x.split(','),
但是它显示invalid syntax
。