代码之家  ›  专栏  ›  技术社区  ›  Kevin Choi

熊猫按行排序

  •  0
  • Kevin Choi  · 技术社区  · 6 年前
    Date        Count_Doc   Sum_Words   S&P 500     Russel 2000  Nasdaq     
    2017-02-16  0.069946    3.839240    -0.568454   -0.514334   -0.592410
    2017-04-12  1.655428    3.667811    -0.891697   -1.450381   -1.047976
    2017-04-19  2.371889    2.110689    -0.284174   0.401092    0.427705
    2017-04-20  3.261538    2.995514    1.846039    1.360092    1.660339
    2017-05-02  0.738549    2.197852    0.081593    -0.849580   -0.231491
    

    我想保持“count_doc”和“sum_words”列不变,但我正在尝试按其值对其余列进行排序,如下所示:(顺序没有排序,只是死板地填充)

    Date        Count_Doc   Sum_Words   1st         2nd         3rd
    2017-02-16  0.069946    3.839240    S&P 500     Nasdaq      Russel 2000
    2017-04-12  1.655428    3.667811    Nasdaq      S&P 500     Russel 2000
    2017-04-19  2.371889    2.110689    Nasdaq      S&P 500     Russel 2000
    2017-04-20  3.261538    2.995514    Russel 2000 Nasdaq      S&P 500 
    2017-05-02  0.738549    2.197852    Russel 2000 S&P 500     Nasdaq  
    

    有没有办法将列的名称作为这样的数据帧值返回?

    谢谢您!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Scott Boston    6 年前

    使用此:

    df = df.set_index(['Date','Count_Doc','Sum_Words'])
    df_out = pd.DataFrame(df.columns[df.values.argsort(1)[::-1]].values, 
                           df.index, 
                           columns=['1st','2nd','3rd']).reset_index()
    df_out
    

    输出:

             Date  Count_Doc  Sum_Words          1st          2nd          3rd
    0  2017-02-16   0.069946   3.839240  Russel 2000       Nasdaq      S&P 500
    1  2017-04-12   1.655428   3.667811  Russel 2000       Nasdaq      S&P 500
    2  2017-04-19   2.371889   2.110689      S&P 500  Russel 2000       Nasdaq
    3  2017-04-20   3.261538   2.995514  Russel 2000       Nasdaq      S&P 500
    4  2017-05-02   0.738549   2.197852       Nasdaq      S&P 500  Russel 2000
    
        2
  •  1
  •   Haleemur Ali    6 年前

    通过对每行的3个索引进行排序,可以向数据框中添加3个附加列。

    df[['1st', '2nd', '3rd']] = df.iloc[:, [3,4,5]].apply(lambda x: pd.Series(x.sort_values(ascending=False).index), axis=1)
    outputs:
    
             Date  Count_Doc  Sum_Words     ...               1st          2nd          3rd
    0  2017-02-16   0.069946   3.839240     ...       Russel 2000      S&P 500       Nasdaq
    1  2017-04-12   1.655428   3.667811     ...           S&P 500       Nasdaq  Russel 2000
    2  2017-04-19   2.371889   2.110689     ...            Nasdaq  Russel 2000      S&P 500
    3  2017-04-20   3.261538   2.995514     ...           S&P 500       Nasdaq  Russel 2000
    4  2017-05-02   0.738549   2.197852     ...           S&P 500       Nasdaq  Russel 2000
    

    在这里,我只选择要对其名称进行排序的3列,然后应用一个函数row wise,它接受一个序列,对其进行排序,获取其索引(即名称),并将索引作为一个新序列返回。

    然后将其分配给新列 ['1st', '2nd', '3rd'] .

    注意,我使用的排序顺序是降序的,而在您的示例输出中,您只是显示了一个随机顺序。