【问题标题】:Use a categorical column to order the dataframe according to an array使用分类列根据数组对数据框进行排序
【发布时间】:2021-02-07 13:07:43
【问题描述】:

我有一个这样的数组:

['A 100', 'A 200', 'A 300', 'A 400', 'A 500', 'B 100', 'B 200', 'B 300', 'B 400']

我也有这样的数据框:

BIN      CA      SUM
100       B      B 100
300       A      A 300
300       B      B 300
400       B      B 400
400       A      A 400
200       B      B 200
100       A      A 100
200       A      A 200

我想使用pd.Categorical根据数组对列数据框进行排序。

预期的输出是:

BIN      CA      SUM
100       A      A 100
200       A      A 200
300       A      A 300
400       A      A 400
100       B      B 100
200       B      B 200
300       B      B 300
400       B      B 400

【问题讨论】:

    标签: python pandas dataframe categorical-data


    【解决方案1】:

    您可以使用pd.CategoricalSUM 列转换为具有顺序的分类列,然后使用sort 值:

    df['SUM'] = pd.Categorical(df['SUM'], categories=arr, ordered=True)
    df.sort_values('SUM')
    

    或者,您可以创建一个字典,将arr 中的项目映射到它们的排序顺序,然后在SUM 列上的.map 这个字典,并使用np.argsort 来获取将对数据帧进行排序的索引:

    dct = {v: i for i, v in enumerate(arr)}
    df.iloc[np.argsort(df['SUM'].map(dct))]
    

       BIN CA    SUM
    6  100  A  A 100
    7  200  A  A 200
    1  300  A  A 300
    4  400  A  A 400
    0  100  B  B 100
    5  200  B  B 200
    2  300  B  B 300
    3  400  B  B 400
    

    【讨论】:

      【解决方案2】:

      您可以根据您的specified listCA 列设置为index 然后最后reindex

      d = [[100, 'B' , 'B 100'],
      [300, 'A' , 'A 300'],
      [300, 'B' , 'B 300'],
      [400, 'B' , 'B 400'],
      [400, 'A' , 'A 400'],
      [200, 'B' , 'B 200'],
      [100, 'A' , 'A 100'],
      [200, 'A',  'A 200']]
      
      df = pd.DataFrame(d , columns=['BIN', 'CA', 'SUM'])
      
      l =['A 100', 'A 200', 'A 300', 'A 400', 'A 500', 'B 100', 'B 200', 'B 300', 'B 400']
      
      df2 = df.set_index('SUM').reindex(l)
      df2.dropna(inplace=True) #dropna is required of your list has some element that is not in the original dataframe, in this case A 500
      df2
      
      SUM      BIN    CA
          
      A 100   100.0   A
      A 200   200.0   A
      A 300   300.0   A
      A 400   400.0   A
      B 100   100.0   B
      B 200   200.0   B
      B 300   300.0   B
      B 400   400.0   B
      ``
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-02
        • 2020-08-05
        • 1970-01-01
        • 2015-08-21
        • 2020-05-15
        • 2020-02-29
        • 1970-01-01
        • 2012-12-01
        相关资源
        最近更新 更多