【问题标题】:After sorting by mean, how to sort by highest minimum按均值排序后,如何按最高最小值排序
【发布时间】:2019-06-03 17:33:05
【问题描述】:

我有一个带有列=用户名行=餐厅名称的熊猫数据框。这些值是用户给出的评级。然后按均值排序。例如:

ratings = pd.DataFrame(data=[[1, 4], [5, 8], [7, 9], [3, 4], [8, 8], [6, 7], [5, 2], [4, 9]], 
                        index=['rest1', 'rest2', 'rest3', 'rest4', 'rest5', 'rest6', 'rest7', 'rest8'], 
                        columns=[user1, user2])

ratings_sorted = preds_db.sort_values(by='mean', ascending=False)

现在,在平局的情况下,我希望 两个用户的最小值都较高的餐厅排名更高。例如,rest2、rest6 和 rest8 的平均值均为 6.5,但我希望它们的排名如下:rest6 > rest2 > rest8,因为 rest6=(6, 7),rest2=(5, 8),rest8=(4 ,9)。

我的计划是创建一个新的列表,其中包含已使用的餐厅,并将其用作新索引。这是我超级混乱的尝试:

def highest_min(rest1, rest2, db):
    if db.loc[rest1].min() > db.loc[rest2].min():
        return [rest1, rest2]
    return [rest2, rest1]

def add_resorted_column(preds_db_sorted):
    resorted = []
    for i, rest in enumerate(preds_db_sorted.index):
        if i < len(preds_db_sorted.index)-1:
            if preds_db_sorted.iloc[i]['mean'] != preds_db_sorted.iloc[i+1]['mean']:
                if preds_db_sorted.index[i] not in resorted:
                    resorted.append(rest)
            else:
                resorted.extend(highest_min(
                            preds_db_sorted.index[i], 
                            preds_db_sorted.index[i+1], 
                            preds_db_sorted))
        else: 
            if preds_db_sorted.index[-1] not in resorted:
                resorted.append(preds_db_sorted.index[-1]) 
    return resorted

我知道一定有更好的出路。此外,当有两个以上的餐厅并列时,这会产生重复的问题。此外,我想扩展它以供两个以上的用户使用。谢谢!

【问题讨论】:

    标签: python pandas sorting min


    【解决方案1】:

    只需将meanminconcat 一起使用并将它们排序在一起

    idx=pd.concat([ratings.mean(1),ratings.min(1)],axis = 1).\
            sort_values([0,1],ascending=[True,False]).\
                 index
    ratings.loc[idx]
           user1  user2
    rest1      1      4
    rest4      3      4
    rest7      5      2
    rest6      6      7
    rest2      5      8
    rest8      4      9
    rest5      8      8
    rest3      7      9
    ratings=ratings.loc[idx]
    

    【讨论】:

      【解决方案2】:
          import pandas as pd
          ratings = pd.DataFrame(data=[[1, 4], [5, 8], [7, 9], [3, 4], [8, 8], [6, 7], [5, 2], [4, 9]], 
                                  index=['rest1', 'rest2', 'rest3', 'rest4', 'rest5', 'rest6', 'rest7', 'rest8'], 
                                  columns=['user1', 'user2'])
          ratings['mean']=ratings.mean(axis=1)
          ratings['min']=ratings.min(axis=1)
          ratings_sorted = ratings.sort_values(by=['mean','min'], ascending=False)
          print(ratings_sorted)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多