2017-10-13 304 views
2

排序列表列我有数据框如下:熊猫数据帧:在数据帧

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

我不知道如何解决这个问题。有人可以帮我解决它。

在此先感谢。

回答

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,因为我不熟悉它。但我希望你明白这一点。

+0

这是给我的错误是“AttributeError的:‘系列’对象有没有属性‘分裂’” –

+0

@NilakshiNaphade对不起,我没有与任何特定的测试DF。我只是假设你的'TypeList'列包含字符串。您可能需要根据其类型转换您的单元格内容 – lotrus28

+0

我尝试将字符串转换为y = x.str.split(','),但随后出现错误为“AttributeError:'str'object has no attribute'str' “ –

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