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

时间:2018-01-03 06:49:11

标签: python pandas dataframe pandas-groupby

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

2 个答案:

答案 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();
    });

};