如何在 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
请注意,这会删除重复的组最高计数。
这是一种方法。
设置 DataFrameGroupBy 对象:
df.groupby(["Brand", "Model"])
使用 GroupBy size
函数计算每个子组的大小(returns 作为一个系列):
df.groupby(["Brand", "Model"]).size()
转换回 DataFrame,同时命名包含由 size
:
计算的值的列
df.groupby(["Brand", "Model"]).size().reset_index(name="Count")
按 Count
子组项的降序对 DataFrame 进行排序:
df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)
删除重复的 Brand
值,保留 DataFrame 中的第一个条目:
df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")
我有一个 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
请注意,这会删除重复的组最高计数。
这是一种方法。
设置 DataFrameGroupBy 对象:
df.groupby(["Brand", "Model"])
使用 GroupBy
size
函数计算每个子组的大小(returns 作为一个系列):df.groupby(["Brand", "Model"]).size()
转换回 DataFrame,同时命名包含由
计算的值的列size
:df.groupby(["Brand", "Model"]).size().reset_index(name="Count")
按
Count
子组项的降序对 DataFrame 进行排序:df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)
删除重复的
Brand
值,保留 DataFrame 中的第一个条目:df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")