groupby:尝试按国家分组,列出每个国家的前10个品种以及平均价格和平均点数

2024-10-03 11:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图生成一个按国家分组的数据框架,列出每个国家的十大葡萄酒品种及其平均价格和点数。你知道吗

我成功地按国家和葡萄酒进行了分组,并得出了平均价格和积分。 我可以使用value_counts()生成每个国家的前10个品种。nlargest(10),但我无法通过平均数除去初始组中的剩余品种

countryGroup = df.groupby(['country', 'variety'])['price','points'].mean().round(2).rename(columns = {'price':'AvgPrice','points':'AvgPoints'})
countryVariety = df.groupby('country')['variety']
countryVariety = countryVariety.apply(lambda x:x.value_counts().nlargest(10))

data link

enter image description here

实际结果是列出了每个国家的前10个品种。 但我需要的是平均价格和积分


Tags: 数据dfvalue国家countrypricepointsgroupby
1条回答
网友
1楼 · 发布于 2024-10-03 11:20:45

下面是一些示例数据。对于这些需要大量数据的问题,生成随机测试数据非常有用,可以用几行代码完成:

import pandas as pd
import numpy as np
import string

np.random.seed(123)
n = 1000
df = pd.DataFrame({'country': np.random.choice(list('AB'), n),
                   'variety': np.random.choice(list(string.ascii_lowercase), n),
                   'price':  np.random.normal(100, 10, n),
                   'points': np.random.choice(100, n)})

解决这个问题的一种方法是groupby两次。第一个允许我们计算每个国家品种组的数量。第二个以.sort_values+tail保持每个国家前10名(基于规模)

df_agg = (df.groupby(['country', 'variety']).agg({'variety': 'size', 'price': 'mean', 'points': 'mean'})
            .rename(columns={'variety': 'size'}))
df_agg = df_agg.sort_values('size').groupby(level=0).tail(10).sort_index()

输出:

                 size       price     points
country variety                             
A       c          19   98.606563  45.842105
        e          19  102.264391  48.894737
        l          23   96.469739  52.913043
        n          27   99.532544  55.740741
        p          20   98.298753  49.700000
        q          21   98.660938  60.666667
        u          26  101.330755  63.615385
        x          20  102.540790  48.550000
        y          23   99.553557  49.869565
        z          27   99.968973  44.259259
B       b          25   99.375984  56.360000
        c          22  100.632402  56.181818
        e          25   99.476491  49.520000
        k          22   96.991041  40.090909
        p          24   99.802004  51.333333
        q          26   99.022372  53.884615
        u          22  103.063360  49.090909
        v          24  101.907610  53.250000
        x          22   94.607472  49.227273
        z          23   98.984382  44.739130

相关问题 更多 >