我有一个 pandas 数据框,如下所示:
U1 U2 U3
U1 1.0 0.0 0.2
U2 0.4 1.0 0.0
U3 0.0 0.45 1.0
这里,U1、U2和U3是索引和列标题。 我想对每行中的值进行排序,然后从每行中选择前 20 个。 但是,排序后,我还需要知道特定值来自哪一行和哪一列。 例如,如果我单独对每一行进行排序,我将得到:
U2 U3 U1
U1 0.0 0.2 1.0
第一行
U3 U1 U2
U2 0.0 0.4 1.0
第二行
U1 U2 U3
U3 0.0 0.45 1.0
第三行。
但是,现在每行的列顺序都不同。 是否有一种有效的方法/数据结构(最好是数据框或 numpy 数组)可以聚合这些排序信息?
最佳答案
您可以使用numpy.argsort
获取位置,然后按 DataFrame 的值对列的值重新排序:
pos = df.values.argsort(axis=1)
df1 = pd.DataFrame(df.columns[pos], index=df.index)
print (df1)
0 1 2
U1 U2 U3 U1
U2 U3 U1 U2
U3 U1 U2 U3
arr1 = df.columns.values[pos]
print (arr1)
[['U2' 'U3' 'U1']
['U3' 'U1' 'U2']
['U1' 'U2' 'U3']]
要按 pos
更改位置,请使用:
df2 = pd.DataFrame(df.values[np.arange(len(df))[:, None], pos], index=df.index)
print (df2)
0 1 2
U1 0.0 0.20 1.0
U2 0.0 0.40 1.0
U3 0.0 0.45 1.0
arr2 = df.values[np.arange(len(df))[:, None], pos]
print (arr2)
[[0. 0.2 1. ]
[0. 0.4 1. ]
[0. 0.45 1. ]]
关于python - 对数据框行进行排序,同时保留列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378808/