df = pd.DataFrame({'id': [1, 2, 3, 4, 5], 'p1': [0, 0, 1, 1, 2], 'p2': [9, 2, 3, 5, 3], 'p3': [1, 3, 10, 3, 7], 'p4': [4, 4, 7, 1, 10]})df = df.set_index('id')df p1 p2 p3 p4id 1 0 9 1 42 0 2 3 43 1 3 10 74 1 5 3 15 2 3 7 10現在假設我有一個數據框,其中包含 df 數據幀的每個元素所需的行順序位置。例如,比如說, order=np.argsort(-df.values,axis=1)orderarray([[1, 3, 2, 0], [3, 2, 1, 0], [2, 3, 1, 0], [1, 2, 0, 3], [3, 2, 1, 0]], dtype=int64)如何根據 order 數組的元素對 df 數據幀元素進行排序?期望的結果是 p1 p2 p3 p4id 1 9 4 1 02 4 3 2 03 10 7 3 14 5 3 1 15 10 7 3 2
2 回答

偶然的你
TA貢獻1841條經驗 獲得超3個贊
您可以使用通過numpy.take_along_axis提供的“花哨”索引來創建數據數組,然后重新創建整個 DataFrame。
pd.DataFrame(np.take_along_axis(df.to_numpy(), order, axis=1),
index=df.index,
columns=df.columns)
p1 p2 p3 p4
id
1 9 4 1 0
2 4 3 2 0
3 10 7 3 1
4 5 3 1 1
5 10 7 3 2

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
創建一個如下所示的映射器,然后您可以執行以下操作:
mapper={0:'p1',1:'p2',2:'p3',3:'p4'}
df_copy=df.copy()
for index, row in df.iterrows():
i=0
for name, values in row.iteritems():
df[name][index]=df_copy[mapper[order[index-1][i]]][index]
i=i+1
添加回答
舉報
0/150
提交
取消