【问题标题】:Sorting a pandas dataframe rowwise按行对熊猫数据框进行排序
【发布时间】:2019-04-12 20:49:47
【问题描述】:

一个示例输入数据帧

import pandas as pd
df_input = pd.DataFrame([[1.7, 0.2], [0.4, 0.93], [0.05, 0.96], [0.97, 0.68]], columns=["A", "B"])

此示例有两列,而实际数据框有 10 列。我想按升序对每一行进行排序,然后将 -1 分配给前 5 列,将 +1 分配给接下来的 5 列。示例输出如下:-

df_output=pd.DataFrame([[1, -1], [-1, 1], [-1, 1], [1, -1]], columns=["A", "B"])

请提出前进的方向。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    numpy.wherenp.argsort 一起使用:

    np.random.seed(111)
    
    df_input = pd.DataFrame(np.random.randint(10, size=(10, 10)), columns=list('abcdefghij'))
    print (df_input)
       a  b  c  d  e  f  g  h  i  j
    0  6  8  3  6  6  7  1  8  3  4
    1  5  4  3  7  8  7  0  1  7  2
    2  5  9  0  5  5  1  9  6  2  1
    3  6  0  1  7  0  1  5  9  0  1
    4  7  6  6  5  4  9  0  3  8  0
    5  2  6  9  7  4  2  9  5  7  9
    6  8  8  4  2  5  0  7  0  8  2
    7  7  9  0  8  0  2  0  5  8  1
    8  7  1  3  7  0  2  0  9  9  3
    9  2  2  6  1  9  8  6  0  2  6
    
    arr = np.where(np.argsort(df_input, axis=1) < 5 , -1, 1)
    
    df_output = pd.DataFrame(arr, columns=df_input.columns)
    print (df_output)
       a  b  c  d  e  f  g  h  i  j
    0  1 -1  1  1 -1 -1 -1  1 -1  1
    1  1  1  1 -1 -1 -1 -1  1  1 -1
    2 -1  1  1  1 -1 -1 -1  1 -1  1
    3 -1 -1  1 -1  1  1  1 -1 -1  1
    4  1  1  1 -1 -1 -1 -1 -1  1  1
    5 -1  1 -1  1 -1 -1  1 -1  1  1
    6  1  1 -1  1 -1 -1  1 -1 -1  1
    7 -1 -1  1  1  1  1 -1 -1  1 -1
    8 -1  1 -1  1 -1  1 -1 -1  1  1
    9  1 -1 -1 -1  1 -1  1  1  1 -1
    

    【讨论】:

    • @pyd - 它总是用于相同的随机数据,检查this
    【解决方案2】:

    你可以rank,然后通过numpy.where有条件地赋值:

    df[:] = np.where(df.rank(axis=1) > df.shape[1] / 2, 1, -1)
    
    print(df)
    
       A  B
    0  1 -1
    1 -1  1
    2 -1  1
    3  1 -1
    

    注意:这假设重复值总是获得相同的排名。

    【讨论】:

      【解决方案3】:
      o = df_input.sort_values(by=list(df_input.columns), ascending=True, na_position='first')
      o[list(df_input.columns)[:5]] = -1
      o[list(df_input.columns)[6:]] = 1
      

      【讨论】:

      • 感谢您的宝贵时间
      【解决方案4】:

      你想要np.argsort:

      np.argsort(df_input, axis=1).replace(0, -1)
      
         A  B
      0  1 -1
      1 -1  1
      2 -1  1
      3  1 -1
      

      推广到 N 行:

      v = np.where(np.argsort(df_input) >= df.shape[1] // 2, 1, -1)    
      df_output =  pd.DataFrame(v)
      

      print(df)
          0   1   2   3   4   5   6   7   8   9
      0  49  80  80  27  15  13  52  50  48  69
      1  51  24  55  73  81  55  32  67  19  14
      2  67   2  29  19  14  89  54  83  22  64
      3  24  55  87  94  22  61  74  26  37   8
      
      v = np.where(np.argsort(df_input) >= df.shape[1] // 2, 1, -1)    
      df_output =  pd.DataFrame(v)
      
      print(df_output)
         0  1  2  3  4  5  6  7  8  9
      0  1 -1 -1  1 -1  1  1  1 -1 -1
      1  1  1 -1  1 -1 -1  1  1 -1 -1
      2 -1 -1 -1  1 -1  1  1 -1  1  1
      3  1 -1 -1  1  1 -1  1  1 -1 -1
      

      【讨论】:

      • 谢谢。但是当我将它扩展到 9 列的数据框时,我得到 -1、1、2、3、4、5、6、7 和 8。我需要 -1、-1、-1、-1、1、1, 1,1,1
      • @AbhishekKulkarni 请再看看。
      • 是的,做到了。谢谢
      猜你喜欢
      • 2021-08-08
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多