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 p4
id
1 0 9 1 4
2 0 2 3 4
3 1 3 10 7
4 1 5 3 1
5 2 3 7 10
现在假设我有一个数据帧,其中包含df数据帧的每个元素的所需行方向位置。例如,
order=np.argsort(-df.values,axis=1)
order
array([[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 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
答案 0 :(得分:5)
您可以使用numpy.take_along_axis
提供的“ fancy”索引来创建数据数组,然后重新创建整个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
答案 1 :(得分:0)
创建一个映射器,如下所示:
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