【问题标题】:Sort Dataframe by Descending Rows AND Columns at the Same Time通过同时降序行和列对数据框进行排序
【发布时间】:2020-03-27 13:35:33
【问题描述】:

目前有一个按系列显示国家/地区的数据框,值范围为 0-25

我想对 df 进行排序,使最高值出现在左上角(第一个),而最低值出现在右下角(最后一个)。

来自

        A   B   C   D  ...

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

      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吗?
  • 请原谅歧义,谢谢大家的回答!将编辑帖子以更好地反映预期输出...

标签: python pandas sorting dataframe indexing


【解决方案1】:

使用.Ttranspose 行到列,反之亦然:

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

【讨论】:

  • 为什么知道一定要D点?我认为这不是一个通用的解决方案。
  • 你是对的!编辑我的答案以按df.max().idxmax() 排序,而不是任意选择具有最高值的列。
  • 不应该是4, 0在第二行,2, 1在最后一行吗?
  • ¯_(ツ)_/¯ 问题可以有多种解释方式。
  • 我认为预期的输出不言自明
【解决方案2】:

你可以使用:

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

【讨论】:

  • 这与预期结果不符。
  • 他的确实有,你的没有。 @jorijnsmit
  • 好好看看预期的结果,现在我注意到你的答案不匹配
  • 我不明白为什么最后第一行有2, 3 而不是3, 2
  • 很高兴为您提供帮助:)
【解决方案3】:

这是另一种方式,这次没有转置,而是使用axis=1 作为参数:

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

【讨论】:

    【解决方案4】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2021-05-06
      • 2014-09-19
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多