Pandas 分别对每一列进行排序并并排添加新的参考列
Pandas sort every column separately and add new reference column by side
我有一个像这样的数据框:
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
任何帮助将不胜感激。
此致。
您可以将列表理解与 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
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
我有一个像这样的数据框:
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
任何帮助将不胜感激。
此致。
您可以将列表理解与 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
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