Pandas分别对每列进行排序,并逐列添加新的参考

时间:2018-01-11 12:18:35

标签: pandas sorting dataframe lookup

我有一个类似的数据框:

    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

任何帮助将不胜感激。

问候。

2 个答案:

答案 0 :(得分:3)

您可以将列表理解与sort_valuesconcat一起使用:

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