【问题标题】:Sort all columns of a dataframe对数据框的所有列进行排序
【发布时间】:2017-05-21 07:05:12
【问题描述】:

我有一个 2000 行和 500 列的数据框。我想按升序对每一列进行排序。列没有名称,它们只是编号为 0-500。

随机数据: df = pandas.DataFrame(np.random.randint(0,100,size=(2000, 500)), columns=range(500))

使用 df.sort_values(by=0,axis=0) 按预期对第 0 列进行排序。但随后使用 df.sort_values(by=1,axis=0) 对第一列进行排序,但再次对第 0 列进行洗牌。换句话说,我想要

index  0  1  2
1      5  5  5
2      6  7  5
3      7  9  8

但我一次只能对一列进行排序。我已经尝试过df.sort_values(by=df.columns[0:524],axis=0),但这会引发一个关键错误。

【问题讨论】:

  • 有人可以发布一个等效的 scala 答案吗?

标签: python sorting pandas dataframe


【解决方案1】:

我认为您可以将numpy.sortDataFrame 构造函数一起使用,或者将applysort_valuesvalues 转换为numpy array 一起使用:

df = pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns)

另一种解决方案,速度较慢:

df = df.apply(lambda x: x.sort_values().values)

print (df)
      0    1    2    3    4    5    6    7    8    9   ...   490  491  492  \
0       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
1       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
2       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
3       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
4       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
5       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
6       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
7       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
8       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
9       0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
10      0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
11      0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
12      0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
13      0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
14      0    0    0    0    0    0    0    0    0    0 ...     0    0    0   
15      0    0    0    0    0    1    0    0    0    0 ...     0    0    0   
16      0    0    0    0    0    1    1    0    0    0 ...     0    0    0   
17      0    0    0    0    0    1    1    0    0    0 ...     0    0    0   
18      0    0    0    0    0    1    1    0    0    0 ...     0    0    0   
19      0    0    0    0    0    1    1    1    1    0 ...     0    0    0   
20      0    0    1    0    0    1    1    1    1    0 ...     0    0    0   
21      0    0    1    0    0    1    1    1    1    1 ...     0    1    0   
22      0    1    1    0    0    1    1    1    1    1 ...     0    1    0   
23      1    1    1    0    0    1    1    1    1    1 ...     0    1    0   
24      1    1    1    0    0    1    1    1    1    1 ...     0    1    0   
25      1    1    1    1    0    1    1    1    1    1 ...     0    1    0   
26      1    1    1    1    0    1    1    1    1    1 ...     1    1    1   
27      1    1    1    1    0    1    1    1    1    1 ...     1    1    1   
28      1    1    1    1    0    1    1    1    1    1 ...     1    1    1   
29      1    1    1    1    0    1    1    1    1    1 ...     1    1    1   
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ... ...   ...  ...  ...   
1970   97   98   98   98   98   98   99   98   98   98 ...    98   98   98   
1971   97   98   98   98   98   98   99   98   98   98 ...    98   98   98   
1972   98   98   98   98   98   98   99   98   98   98 ...    98   98   98   
1973   98   98   98   99   98   98   99   98   98   98 ...    98   98   98   
1974   98   98   98   99   98   98   99   98   98   98 ...    98   98   98   
1975   98   98   98   99   98   98   99   98   98   98 ...    98   98   98   
1976   98   98   98   99   98   98   99   98   99   99 ...    98   98   98   
1977   98   98   98   99   98   98   99   98   99   99 ...    98   98   99   
1978   98   98   98   99   98   98   99   98   99   99 ...    98   98   99   
1979   98   98   98   99   99   99   99   98   99   99 ...    98   98   99   
1980   98   98   98   99   99   99   99   98   99   99 ...    98   98   99   
1981   99   99   98   99   99   99   99   98   99   99 ...    99   98   99   
1982   99   99   98   99   99   99   99   98   99   99 ...    99   98   99   
1983   99   99   98   99   99   99   99   98   99   99 ...    99   98   99   
1984   99   99   98   99   99   99   99   99   99   99 ...    99   99   99   
1985   99   99   98   99   99   99   99   99   99   99 ...    99   99   99   
1986   99   99   98   99   99   99   99   99   99   99 ...    99   99   99   
1987   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1988   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1989   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1990   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1991   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1992   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1993   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1994   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1995   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1996   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1997   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1998   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   
1999   99   99   99   99   99   99   99   99   99   99 ...    99   99   99   

      493  494  495  496  497  498  499  
0       0    0    0    0    0    0    0  
1       0    0    0    0    0    0    0  
2       0    0    0    0    0    0    0  
3       0    0    0    0    0    0    0  
4       0    0    0    0    0    0    0  
5       0    0    0    0    0    0    0  
6       0    0    0    0    0    0    0  
7       0    0    0    0    0    0    0  
8       0    0    0    0    0    0    0  
9       0    0    0    0    0    0    0  
10      0    0    0    0    0    0    0  
11      0    0    0    0    0    0    0  
12      0    0    0    0    0    0    0  
13      0    0    0    0    0    0    0  
14      0    0    0    0    0    0    0  
15      0    0    0    0    1    0    0  
16      0    1    0    0    1    0    0  
17      0    1    0    0    1    0    0  
18      1    1    0    0    1    0    0  
19      1    1    1    0    1    0    0  
20      1    1    1    0    1    0    1  
21      1    1    1    0    1    0    1  
22      1    1    1    0    1    0    1  
23      1    1    1    0    1    0    1  
24      1    1    1    0    1    0    1  
25      1    1    1    0    1    0    1  
26      1    1    1    0    1    0    1  
27      1    1    1    1    1    0    1  
28      1    1    1    1    1    0    1  
29      1    1    1    1    1    0    1  
...   ...  ...  ...  ...  ...  ...  ...  
1970   98   98   98   98   98   98   98  
1971   98   98   98   98   98   98   98  
1972   98   98   98   98   98   98   98  
1973   98   98   98   98   98   98   98  
1974   98   98   98   99   98   98   98  
1975   98   98   98   99   98   98   98  
1976   99   98   98   99   98   98   98  
1977   99   98   98   99   98   98   98  
1978   99   98   98   99   99   98   98  
1979   99   99   98   99   99   98   98  
1980   99   99   98   99   99   99   99  
1981   99   99   98   99   99   99   99  
1982   99   99   98   99   99   99   99  
1983   99   99   99   99   99   99   99  
1984   99   99   99   99   99   99   99  
1985   99   99   99   99   99   99   99  
1986   99   99   99   99   99   99   99  
1987   99   99   99   99   99   99   99  
1988   99   99   99   99   99   99   99  
1989   99   99   99   99   99   99   99  
1990   99   99   99   99   99   99   99  
1991   99   99   99   99   99   99   99  
1992   99   99   99   99   99   99   99  
1993   99   99   99   99   99   99   99  
1994   99   99   99   99   99   99   99  
1995   99   99   99   99   99   99   99  
1996   99   99   99   99   99   99   99  
1997   99   99   99   99   99   99   99  
1998   99   99   99   99   99   99   99  
1999   99   99   99   99   99   99   99  

【讨论】:

  • TheBamf 的回答更加简洁优雅地达到了同样的预期效果
  • @FlorianH - 是的,更优雅,但如果性能很重要,那么它会更慢,因为单独处理每一列,在这个答案中处理所有值,所以更快。
  • @FlorianH - 我得到了这个时间In [177]: %timeit pd.DataFrame(np.sort(df.values, axis=0), index=df.index, columns=df.columns) 524 µs ± 31.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) In [178]: %timeit df.transform(np.sort) 1.68 ms ± 17.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • @jezrael - 正确,在我的机器上,您的第一个命题比 TheBamf 的答案快 2 倍(问题作者的示例为 0.05 秒对 0.1 秒)。很高兴知道,谢谢!
【解决方案2】:

我认为现在最优雅的解决方案是df.transform(np.sort)

【讨论】:

  • 这似乎比使用 sort_values 快得多
【解决方案3】:
>>> df.sort_values(by=list(df.columns),axis=0)
       0  1  2
index         
1      5  5  5
2      6  7  5
3      7  9  8

【讨论】:

    【解决方案4】:

    要对数据框的所有列进行排序,作为by=list(df.columns) 的替代方法,您可以使用by=df.columns.to_list(),如下所示:

    df.sort_values(by=df.columns.to_list())
    

    文档:

    【讨论】:

      【解决方案5】:
      df.sort(['col1','col2', ..., 'colN'],ascending=False)
      

      df.sort(list(df.columns),ascending=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2011-11-12
        相关资源
        最近更新 更多