我有以下格式的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项。我怎么能这样做?
答案 0 :(得分: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
答案 1 :(得分:2)
使用双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
即
function getMessages() {
authToken = localStorage.token;
// Build the HTTP request payload (the Message object).
// Save email address so it doesn't get lost with two way data binding.
vm.emailAddressSent = vm.emailAddress;
GraphHelper.getMessages()
.then(function (response) {
$log.debug('HTTP request to the Microsoft Graph API returned successfully.', response);
vm.requestSuccess = true;
vm.requestFinished = true;
$scope.data=response;
vm.data=response;
$scope.$apply();
}, function (error) {
$log.error('HTTP request to the Microsoft Graph API failed.');
vm.requestSuccess = false;
vm.requestFinished = true;
$scope.$apply();
});
};