python - 对数据框行进行排序,同时保留列

标签 python pandas numpy dataframe

我有一个 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/

相关文章:

python - 如何分组并取一列的计数除以 python pandas 中数据框第二列的唯一计数?

python - 是否有更可读(和有效)的方法来遍历 ndarray?

python - 按顺序为数据框中的多行从列表中分配多个值

python - 将pandas groupby对象转换为数据框列表

python - Plotly:如何更改跟踪顺序,或在 plotly 中切换轴的边?

python - 在 Pandas 稀疏矩阵中查找全零列

python - Openpyxl:将背景颜色设置为行和列属性错误

python - 程序不返回任何值而不返回值

python - 如何创建一个频率为一小时(不包括周末)的 pandas.date_range ?

python - Numpy 中的二进制计数