[英]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
的排序值對col1
和col2
、 col3
的列表進行排序以獲得以下輸出的最有效方法是什么?
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.