python - 在保留列的同时对数据框行进行排序
问题描述
我有一个熊猫数据框,如下所示:
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
第 2 行
U1 U2 U3
U3 0.0 0.45 1.0
第三排。
但是,现在每一行的列顺序都不同。是否有一种有效的方式/数据结构(最好是数据框或 numpy 数组),我可以在其中聚合这些排序信息?
解决方案
您可以使用numpy.argsort
for 位置,然后重新排序列的值和 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. ]]
推荐阅读
- c# - C# Distinct 逗号分隔值不起作用
- jquery - 使用 jQuery 和 ajax() 方法从复选框传递参数
- r - 使用 lmer() 函数对线性混合效应模型重复出现的错误
- sql - SQL - 获取数组中特定元素的值
- r - dplyr 的 ungroup() 函数何时删除 'vars' 属性?
- python - groupby 和聚合一定范围的月份(11 月至 6 月)
- xml - 使用 XSL 按位置排序
- python - 在 python 线程池中的线程之间共享变量
- laravel - 如何为不同的项目 Laravel 任务调度有多个 crontab 条目?
- haskell - 在 GHC-8.2.2 中,重叠实例解析能否取决于文件是否作为暴露模块包含在内?