我有一个类似的数据框:
id 1 2 3 4 5
0 1 0.89 0.99 0.54 0.22 0.61
1 2 0.99 0.56 0.32 0.68 0.66
2 3 0.78 0.26 0.86 0.54 0.59
3 4 0.53 0.34 0.99 0.51 0.99
4 5 0.96 0.89 0.12 0.99 0.16
我正在尝试对每个列进行排序并创建一个新列,该列引用该列中值的id,如:
1 1-id 2 2-id 3 3-id 4 4-id 5 5-id
0 0.99 2 0.99 1 0.99 4 0.99 5 0.99 4
1 0.96 5 0.89 5 0.86 3 0.68 2 0.66 2
2 0.89 1 0.56 2 0.54 1 0.54 3 0.61 1
3 0.78 3 0.34 4 0.32 2 0.51 4 0.59 3
4 0.53 4 0.26 3 0.12 5 0.22 1 0.16 5
任何帮助将不胜感激。
问候。
答案 0 :(得分:3)
您可以将列表理解与sort_values
和concat
一起使用:
df = df.set_index('id')
dfs=[df[x].sort_values(ascending=False).rename_axis(str(x)+'_id').reset_index() for x in df]
df = pd.concat(dfs, 1).sort_index(1)
print (df)
1 1_id 2 2_id 3 3_id 4 4_id 5 5_id
0 0.99 2 0.99 1 0.99 4 0.99 5 0.99 4
1 0.96 5 0.89 5 0.86 3 0.68 2 0.66 2
2 0.89 1 0.56 2 0.54 1 0.54 3 0.61 1
3 0.78 3 0.34 4 0.32 2 0.51 4 0.59 3
4 0.53 4 0.26 3 0.12 5 0.22 1 0.16 5
答案 1 :(得分:1)
In [83]: (-df.drop('id',1)) \
...: .apply(lambda x: df.loc[np.argsort(x), 'id'].values) \
...: .add_suffix('_id') \
...: .join(pd.DataFrame(np.sort(-df.drop('id',1).values, axis=0)*-1,
...: columns=df.columns.drop('id'),
...: index=df.index)) \
...: .sort_index(1)
...:
Out[83]:
1 1_id 2 2_id 3 3_id 4 4_id 5 5_id
0 0.99 2 0.99 1 0.99 4 0.99 5 0.99 4
1 0.96 5 0.89 5 0.86 3 0.68 2 0.66 2
2 0.89 1 0.56 2 0.54 1 0.54 3 0.61 1
3 0.78 3 0.34 4 0.32 2 0.51 4 0.59 3
4 0.53 4 0.26 3 0.12 5 0.22 1 0.16 5