同时按照行和列降序排列数据框

4

TO

我目前有一个数据框,按国家和系列排列,其值范围为0-25。

我希望对数据框进行排序,使最高的值出现在左上角(第一位),而最低的值出现在右下角(最后一位)。

        A   B   C   D  ...

USA     4   0   10  16
CHN     2   3   13  22
UK      2   1   8   14
...

TO

      D   C   A   B   ...

CHN   22  13  2   3
USA   16  10  4   0
UK    14  8   2   1

...

在这里,具有最高值的列现在排在第一位,索引也是如此。

我考虑过重新索引,但这会失去“国家”索引。

    D   C   A   B   ...

0   22  13  2   3
1   16  10  4   0
2   14  8   2   1
...

我考虑创建一个新的列和行,其中包含该列/行的值的平均值或总和,但这是最有效的方法吗? 那么在我有了新的行/列之后,如何对DF进行排序?是否有一种重新索引的方法可以使用...
df_mv.reindex(df_mv.mean(or sum)().sort_values(ascending = False).index, axis=1)

我希望能够保留国家指数,并根据需要进行排序,您有什么建议或帮助吗?

编辑

所需结果将按从大到小的顺序组织列和行。

关于A列和B列第一行在所需输出中的顺序,应分别为2、3。这是因为所需结果将A列解释为比B列在总和和平均值方面更大(即使可以考虑某行/列的“值”是总和还是平均值)。

当我说高数字将位于左上角,低数字将位于右下角时,我只是希望这是结果df的一般趋势。然而,整个列和行才是预期的焦点。对于造成的困惑,深表歉意。


你的结果第一行最后不应该是 3, 2 吗? - Mykola Zotko
请原谅我的歧义,感谢大家的回答!我会编辑帖子以更好地反映预期的输出... - Alex
4个回答

5

你可以使用:

rows_index=df.max(axis=1).sort_values(ascending=False).index
col_index=df.max().sort_values(ascending=False).index
new_df=df.loc[rows_index,col_index]
print(new_df)

      D   C  A  B
CHN  22  13  2  3
USA  16  10  4  0
UK   14   8  2  1

1
他的代码实际上可以运行,而你的却不行。@jorijnsmit - Erfan
仔细看一下期望的结果,现在我注意到你的答案不匹配。 - ansev
1
我不明白为什么第一行末尾你用的是 2, 3 而不是 3, 2 - Mykola Zotko
嗯,问题实际上是含糊不清的。OP要求左上角的最高数字为22,右下角的最低数字为0 - gosuto
1
我很高兴能帮助你 :) - ansev
显示剩余2条评论

3
使用.T将行和列进行转置
df = df.sort_values(df.max().idxmax(), ascending=False)
df = df.T
df = df.sort_values(df.columns[0], ascending=False).T

结果:

>>> df
      D   C  B  A
CHN  22  13  3  2
USA  16  10  0  4
UK   14   8  1  2

2
你为什么知道必须按D排序?我认为这不是一个通用的解决方案。 - ansev
你是正确的!我已经编辑了我的答案,按照 df.max().idxmax() 进行排序,而不是随意选择一个最大值的列。 - gosuto
在最后一行结束时,第二行不应该是4, 0,而最后一行不应该是2, 1吗? - Mykola Zotko
¯_(ツ)_/¯ 这个问题可以有多种解释。 - gosuto
我认为预期的输出说明了一切。 - ansev
显示剩余2条评论

1

这里有另一种方法,这次不需要转置,而是使用axis=1作为参数:

df = df.sort_values(df.max().idxmax(), ascending=False)
df = df.sort_values(df.index[0], axis=1, ascending=False)

1
使用numpy:
arr = df.to_numpy()
arr = arr[np.max(arr, axis=1).argsort()[::-1], :]
arr = np.sort(arr, axis=1)[:, ::-1]
df1 = pd.DataFrame(arr, index=df.index, columns=df.columns)

print(df1)

输出:

      A   B  C  D
USA  22  13  3  2
CHN  16  10  4  0
UK   14   8  2  1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接