我的数据框如下:
| types | TypeList
0 | Q11424 (item) | Q11424 (item),Q571 (item)
1 | Q571 (item) | Q10 (item),Q24 (item)
0 | Q11012 (item) | Q3 (item)
0 | Q4830453 (item) | Q4 (item)
0 | Q7725634 (item) | Q67 (item),Q12 (item)
我想按升序对TypeList列中的元素进行排序。即每行类型列表应根据其整数部分进行排序。我基本上想要输出如下:
| types | TypeList
0 | Q11424 (item) | Q571 (item),Q11424 (item)
1 | Q571 (item) | Q10 (item),Q24 (item)
0 | Q11012 (item) | Q3 (item)
0 | Q4830453 (item) | Q4 (item)
0 | Q7725634 (item) | Q12 (item),Q67 (item)
我可以从此TypeList列中删除所有字符,仅保留","分离的字符串并进一步将其转换为列表,即此列的每一行现在都是类型字符串列表。我想对它进行排序,所以我做了类似下面的事情:
df.TypeList.apply(lambda x: (int(y) for y in x))
但它给结果数据框的所有行值都是
<generator object <lambda>.<locals>.<genexpr> ...
我不确定如何解决这个问题。有人可以帮我解决。
提前致谢。
答案 0 :(得分:1)
import re
import operator
for i in df.index:
x = df.loc[i,'TypeList']
# x == 'Q11424 (item),Q571 (item)'
y = x.split(',')
y = {int(re.search(r'(?<=Q)\d+', k).group(0)):k for k in y}
# y == {11424: 'Q11424 (item)', 571: 'Q571 (item)'}
sorted_y = sorted(y.items(), key=operator.itemgetter(0))
# sorted_y == [(571, 'Q571 (item)'), (11424, 'Q11424 (item)')]
sorted_x = ','.join([i[1] for i in sorted_y])
# sorted_x == 'Q571 (item),Q11424 (item)'
df.loc[i, 'TypeList'] = sorted_x
这个不使用apply
,因为我不熟悉它。但我希望你明白这一点。
答案 1 :(得分:1)
将sorted
与参数key
:
df = (df['TypeList'].str.split(',')
.apply(lambda x: sorted(x, key=lambda y: int(y.split()[0][1:])))
.str.join(','))
print (df)
0 Q571 (item),Q11424 (item)
1 Q10 (item),Q24 (item)
2 Q3 (item)
3 Q4 (item)
4 Q12 (item),Q67 (item)
Name: TypeList, dtype: object