2017-10-13 231 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