python - 对独立于列的每行绝对值以及列名进行排序
问题描述
我有一个类似格式的数据框:
df = pd.DataFrame({
'p1': [0, 0, 1, 1, -2],
'p2': [9, 2, 3, -5, 3],
'p3': [1, 3, 10, 3, 7],
'p4': [4, 4, 7, 1, 10]})
p1 p2 p3 p4
0 0 9 1 4
1 0 2 3 4
2 1 3 10 7
3 1 -5 3 1
4 -2 3 7 10
预期输出:
top1 top2
p2:9 p4:4
p4:4 p3:3
p3:10 p4:7
p2:-5 p3:3
p4:10 p3:7
通过大量研究,我能够排序并获得排序数组的索引。我还能够用列替换索引。但我无法将它们与行值连接起来。
nlargest = 3
order = np.argsort(-df.abs().values, axis=1)[:, :nlargest]
result = pd.DataFrame(df.columns[order],
columns=['top{}'.format(i) for i in range(1, nlargest+1)])
top1 top2 top3
0 p2 p4 p3
1 p4 p3 p2
2 p3 p4 p2
3 p2 p3 p1
4 p4 p3 p2
使用上述方法,我尝试对不同 DataFrame 中的行进行排序,后来想到将它们连接起来。但我找不到正确的方法来做到这一点。我知道这不是最佳方式。
result2 = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns)
result2 = result2.iloc[:, 0:nlargest]
result2.columns = columns=['top{}'.format(i) for i in range(1, nlargest+1)]
top1 top2 top3
0 -2 -5 1
1 0 2 3
2 0 3 3
3 1 3 7
4 1 9 10
请帮助我更正排序和获得预期格式的最短方法。
解决方案
DataFrame.transform
与 一起使用DataFrame.lookup
:
result = result.transform(lambda s: s + ':' + df.lookup(s.index, s).astype(str))
# print(result)
top1 top2 top3
0 p2:9 p4:4 p3:1
1 p4:4 p3:3 p2:2
2 p3:10 p4:7 p2:3
3 p2:-5 p3:3 p1:1
4 p4:10 p3:7 p2:3
推荐阅读
- python - OneHotEncoder : __init__() 得到了一个意外的关键字参数“categorical_features”
- linux - 性能回溯在 Pin 中不可重现
- laravel - Laravel:附加属性会导致 n+1 问题吗?
- fortran - Fortran 中的表格输出,对意外值具有鲁棒性?
- css - 为什么 CSS 尺寸不适用于低宽度?
- git - 如何通过远程设置 git committer 电子邮件
- flutter - 推新屏后如何重建状态
- c# - 如何使用具有权限的电子邮件办公室互操作访问正文属性
- php - 如果有字母字符,MySQL Select 语句不起作用
- css - 将 CSSgram Instagram Willow 过滤器转换为 SVG 过滤器