python - Python - 使用排序操作列和行 - 重塑
问题描述
我有一个输入数据框:
import pandas as pd
df = pd.DataFrame({"AX_970" : {0 : 0.7, 1 : 0.1, 2 : 0.2},
"AZ_980" : {0 : 0.2, 1 : 0.7, 2 : 0.1},
"BV_197" : {0 : 0.5, 1 : 0.2, 2 : 0.3},
"BT_980" : {0 : 0.1, 1 : 0.22, 2 : 0.7}
})
df["id"] = df.index
df.head()
AX_970 AZ_980 BT_980 BV_197 id
0 0.7 0.2 0.1 0.5 0
1 0.1 0.7 0.22 0.2 1
2 0.2 0.1 0.7 0.3 2
我需要转换此输入,如以下输出示例所示:
(输出降序排序)
1 2 3 4 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2
如果您有任何想法,请分享。非常感谢!
解决方案
您可以np.argsort
使用pd.DataFrame.iloc
:
df.iloc[:, :-1] = df.columns[np.argsort(df.iloc[:, :-1].values, axis=1)[:, ::-1]]
df.columns[
print(df)
AX_970 AZ_980 BT_980 BV_197 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2
您可以重命名列,如下所示。逻辑很冗长,因为您不应该就地更新底层数组,因为这可能会导致副作用。
arr = df.columns.values
arr[:-1] = np.arange(1, len(df.columns))
df.columns = arr
print(df)
1 2 3 4 id
0 AX_970 BV_197 AZ_980 BT_980 0
1 AZ_980 BT_980 BV_197 AX_970 1
2 BT_980 BV_197 AX_970 AZ_980 2
推荐阅读
- laravel - 在扩展控制器中调用 Auth:user() Laravel
- javascript - 自定义 fs.readfile 回调函数中的错误以返回 SUCCESS 或 ERROR
- package - if (type == "package") package <- topic 中的错误:参数长度为零
- javascript - PWA 可以自动添加到 macOS 应用程序 Dock 中,还是在登录时自动启动?
- vue.js - Vue.js 在用户刷新页面时显示应由 v-if 标记隐藏的内容
- sql - 连接并转换单独存储为日期和时间的数据,并与 SQL Server 中类似存储的另一条数据进行比较
- cypress - Cypress - 返回包含多个特定字符串的元素
- javascript - 为什么这不将 console.log(score) 打印到控制台?
- python - 将 21 亿行的大型 csv 文件拆分为以列为 ID 的较小文件
- html - 如何使复选框着色(Angular 4+)?