Pandas Dataframe:数据框中的列表列

时间:2017-10-13 10:26:26

标签: python pandas sorting dataframe

我的数据框如下:

   |            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> ...

我不确定如何解决这个问题。有人可以帮我解决。

提前致谢。

2 个答案:

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