Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python groupby:尝试按国家分组,列出每个国家的前10个品种以及平均价格和平均分数_Python_Pandas - Fatal编程技术网

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

Python groupby:尝试按国家分组,列出每个国家的前10个品种以及平均价格和平均分数,python,pandas,Python,Pandas,我试图生成一个数据框架,它按国家分组,列出每个国家的前10个葡萄酒品种及其平均价格和点数 我已成功地按国家和葡萄酒进行分组,并生成了价格和积分的平均值。 我可以使用value_counts()生成每个国家的前10个品种。nlargest(10),但我无法通过使用平均值来除去最初组中的剩余品种 countryGroup = df.groupby(['country', 'variety'])['price','points'].mean().round(2).rename(columns = {'

我试图生成一个数据框架,它按国家分组,列出每个国家的前10个葡萄酒品种及其平均价格和点数

我已成功地按国家和葡萄酒进行分组,并生成了价格和积分的平均值。 我可以使用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))

实际结果是列出了每个国家的前10个品种。
但我需要的是平均价格和点数,这里有一些样本数据。对于这些需要大量数据的问题,生成随机测试数据非常有用,可以在几行中完成:

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
。第一个允许我们计算每个国家品种组的数量。第二个是每个国家(根据大小)的前10名,其排序值为
.sort\u
+
tail

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()
输出:
下面是一些示例数据。对于这些需要大量数据的问题,生成随机测试数据非常有用,可以在几行中完成:

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
。第一个允许我们计算每个国家品种组的数量。第二个是每个国家(根据大小)的前10名,其排序值为
.sort\u
+
tail

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()
输出:
这是我的第一个问题。你能添加一些示例数据和预期输出吗?我怎么做?编辑你的问题,然后添加这些细节这是我的第一个问题。你能添加一些示例数据和预期的输出吗?我该怎么做?编辑你的问题,然后添加这些细节。谢谢你的工作。抱歉,问题质量不好。你能再解释一下这是怎么回事吗?我对潘多拉一无所知。这与您的尝试非常相似,唯一的区别是我还计算了每个国家品种组的大小(这将告诉您该品种在该国出现的次数)
.agg
允许对每列应用不同的函数。然后可以根据大小进行排序(最大的大小在底部)。接下来,您将
groupby(level=0)
这是索引的国家级别,tail(10)选择每个国家的最后10行。由于我们之前进行了分类,这些将是每一个国家最常见的10种葡萄酒。非常感谢。很高兴知道我的想法是正确的。我如何使用round()来表示?@AshutoshMishra您可以在最后调用
.round(2)。它不会影响
size`因为它是一个整数。您好,谢谢您的帮助。抱歉,问题质量不好。你能再解释一下这是怎么回事吗?我对潘多拉一无所知。这与您的尝试非常相似,唯一的区别是我还计算了每个国家品种组的大小(这将告诉您该品种在该国出现的次数)
.agg
允许对每列应用不同的函数。然后可以根据大小进行排序(最大的大小在底部)。接下来,您将
groupby(level=0)
这是索引的国家级别,tail(10)选择每个国家的最后10行。由于我们之前进行了分类,这些将是每一个国家最常见的10种葡萄酒。非常感谢。很高兴知道我的想法是正确的。我如何使用round()来表示?@AshutoshMishra您可以在最后调用
.round(2)。它不会影响
size`因为它是一个整数。