如何在 pandas 中获得群组中最受欢迎的商品?

How can I get the most popular item in a group in pandas?

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

我有一个 pandas 数据框,其中包含一些列(例如:车辆类型、价格、里程、年份、品牌、型号等),对于每个汽车品牌,我想检查出现的是哪种型号最多。 我试过使用 groupby,像这样:

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

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

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

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

但是,我得到了这样一个 pandas 系列:

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

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

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

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

简单的pandas一行:

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

一个解决方案是排序,然后在 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

请注意,这会删除重复的组最高计数。

这是一种方法。

  1. 设置 DataFrameGroupBy 对象:

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

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

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

  3. 转换回 DataFrame,同时命名包含由 size:

    计算的值的列

    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")