我有以下格式的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项。我怎么能这样做?
您可以使用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
使用双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