簡體   English   中英

Pandas:根據另一個列列表中的值對列列表進行排序

[英]Pandas: sort column lists based on values from another column list

給定一個這樣的數據框:

id   col1     col2           col3
------------------------------------------
1    [2,3,1]  ['a','b','c']  ['d','e','f']
2    [3,2,1]  ['a','b','c']  ['d','e','f']

使用col1的排序值對col1col2col3的列表進行排序以獲得以下輸出的最有效方法是什么?

id   col1     col2           col3
------------------------------------------
1    [1,2,3]  ['c','a','b']  ['f','d','e']
2    [1,2,3]  ['c','b','a']  ['f','e','d']

謝謝。

你可以試試這個:

df = pd.DataFrame({'col1':[ [2,3,1], [3,2,1]  ],
                   'col2':[ ['a','b','c'], ['a','b','c'] ],
                   'col3':[ ['d','e','f'], ['d','e','f'] ]})

def custom_sort(x):
    col1 = sorted(enumerate(x.col1), key=lambda k: k[1])
    col2 = [x.col2[i] for i, _ in col1]
    col3 = [x.col3[i] for i, _ in col1]
    return [v for _, v in col1], col2, col3

df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply(custom_sort, axis=1, result_type='expand')
print(df)

印刷:

        col1       col2       col3
0  [1, 2, 3]  [c, a, b]  [f, d, e]
1  [1, 2, 3]  [c, b, a]  [f, e, d]

我會在col1上使用 numpy argsort並使用apply在每列上使用花哨的索引

m = np.array(df.col1.tolist()).argsort()
i_0 = np.arange(df.shape[0])[:,None]    
df[['col1','col2','col3']] = df[['col1','col2','col3']].apply(lambda x: 
                                            np.array(x.tolist())[i_0, m].tolist())

Out[1700]:
   id       col1       col2       col3
0   1  [1, 2, 3]  [c, a, b]  [f, d, e]
1   2  [1, 2, 3]  [c, b, a]  [f, e, d]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM