Pandas Dataframe groupby年份并找到顶级项目

问题描述 投票:2回答:2

我有以下格式的pandas数据帧:

d = {'item_code': ['A', 'B', 'C', 'A', 'A', 'B', 'B', 'A', 'C'], 'year': ['2010', '2010', '2010', '2010', '2010', '2011', '2011', '2011', '2011']}
df = pd.DataFrame(data=d)
df

这就是我的数据帧的样子:

    item_code   year
 0   A           2010
 1   B           2010
 2   C           2010
 3   A           2010
 4   A           2010
 5   B           2011
 6   B           2011
 7   A           2011
 8   C           2011

我使用groupby列出每年及其相应的项目。

df.groupby(['year', 'item_code']).size()

这是结果:

year  item_code
2010  A            3
      B            1
      C            1
2011  A            1
      B            2
      C            1
dtype: int64

我想在一年内获得最好的项目。例如,对于2010年,最高项目是A.同样,对于2011年,最高项目是B.我怎样才能得到它?

并且假设我想每年获得前N项。我怎么能这样做?

python pandas dataframe pandas-groupby
2个回答
3
投票

您可以使用value_counts按计数对每个组进行排序:

N = 2
df1 = df.groupby('year')['item_code'].apply(lambda x: x.value_counts().iloc[:N])
#alternative
#df1 = df.groupby('year')['item_code'].apply(lambda x: x.value_counts().head(N))
print (df1)
year   
2010  A    3
      B    1
2011  B    2
      A    1
Name: item_code, dtype: int64

groupby + head的另一个解决方案:

N = 2
df1 = df.groupby(['year'])['item_code'].value_counts().groupby('year').head(N)
print (df1)
year  item_code
2010  A            3
      B            1
2011  B            2
      A            1
Name: item_code, dtype: int64

2
投票

使用双groupby

df.groupby(['year', 'item_code']).size().sort_values(ascending=False).groupby(level=0).head(1)

year  item_code
2010  A            3
2011  B            2
dtype: int64
© www.soinside.com 2019 - 2024. All rights reserved.