【问题标题】:How can I get the most popular item in a group in pandas?如何在 pandas 中获得组中最受欢迎的项目?
【发布时间】:2019-01-15 18:13:08
【问题描述】:

我有一个包含待售汽车的 Pandas 数据框,我想获得每个品牌最受欢迎的,但我似乎无法做到这一点。

我有一个带有一些列(例如:车辆类型、价格、里程、年份、品牌、型号等)的 pandas 数据框,对于每个汽车品牌,我想检查哪个型号出现最多。 我尝试过使用 groupby,如下所示:

popular_models = dataset.groupby('brand').model.value_counts().groupby(level=0).nlargest(1)

但它返回一个 Pandas 系列,其中我想要的一些数据存储在索引中,它还添加了一个重复的列,这对我来说没有任何意义。

我想要一个包含 3 列的 DataFrame,如下所示:

(https://imgur.com/a/BkKBrv9)

但是,我得到了一个这样的熊猫系列:

(https://imgur.com/a/u8CSXY4)

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python pandas reshape series


    【解决方案1】:

    你必须对你想要保留的两个对象进行分组,然后计算你想要查找出现的对象。这是示例输入文件:

    Brand   Model
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Acura   RDX
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    Beach   Baby
    BMW     320i
    BMW     320i
    BMW     320i
    BMW     320i
    BMW     320i
    BMW     320i
    BMW     320i
    BMW     550i
    BMW     550i
    BMW     550i
    BMW     550i
    BMW     550i
    BMW     550i
    BMW     550i
    Cadillac        Escalade
    Cadillac        Escalade
    Cadillac        Escalade
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    Chana   Cargo
    

    简单的熊猫一班轮:

    df = pd.read_table('fun.txt', header=0)
    print(df.groupby(['Brand','Model'])['Model'].agg(['count']))
    

    还有输出:

                       count
    Brand    Model
    Acura    RDX          10
    BMW      320i          7
             550i          7
    Beach    Baby         10
    Cadillac Escalade      3
    Chana    Cargo        12
    

    如果您想按频率(从大到小)对值进行排序并只保留最大的值,请将单线更改为:

    groupby_df = (df.groupby(['Brand','Model'])['Model'].agg(['count']).sort_values(by='count', ascending=False).reset_index().drop_duplicates('Brand', keep='first'))
    

    得到:

          Brand     Model  count
    0     Chana     Cargo     12
    1     Acura       RDX     10
    2     Beach      Baby     10
    3       BMW      320i      7
    5  Cadillac  Escalade      3
    

    【讨论】:

    • 您好,感谢您的回答,但我认为您忘记添加对值进行排序的代码。您刚刚写道:“如果您想按频率(从大到小)对值进行排序,请将单行代码更改为:”,但从未显示实际代码。另一个问题:我怎样才能为每个品牌保留最常用的模型(丢弃所有其他模型)?
    • 我将更新以展示如何保留最频繁的模型。
    • 更新了答案,展示了如何按品牌只保留频率最高的型号。
    • 如果有 2 个模型具有相同的计数,它将保留排序中的第一个模型
    【解决方案2】:

    一种解决方案是在groupby 操作之后排序然后删除重复项:

    df = pd.DataFrame({'Brand': ['B1'] * 5 + ['B2'] * 5,
                       'Model': ['M1', 'M2', 'M1', 'M2', 'M3',
                                 'N1', 'N1', 'N2', 'N3', 'N1']})
    
    df['Count'] = df.groupby(['Brand', 'Model'])['Model'].transform('count')
    
    res = df.sort_values('Count', ascending=False)\
            .drop_duplicates('Brand')
    
    print(res)
    
    #   Brand Model  Count
    # 5    B2    N1      3
    # 0    B1    M1      2
    

    请注意,这会删除重复的分组顶部计数。

    【讨论】:

      【解决方案3】:

      这是一种方法。

      1. 设置 DataFrameGroupBy 对象:

        df.groupby(["Brand", "Model"])

      2. 使用 GroupBy size 函数计算每个子组的大小(作为系列返回):

        df.groupby(["Brand", "Model"]).size()

      3. 在命名包含由size 计算的值的列时转换回DataFrame:

        df.groupby(["Brand", "Model"]).size().reset_index(name="Count")

      4. 按子组项的Count 对DataFrame 进行降序排序:

        df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)

      5. 删除重复的 Brand 值,保留 DataFrame 中的第一个条目:

        df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")

      【讨论】:

        猜你喜欢
        • 2012-05-08
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        相关资源
        最近更新 更多