在pandas中按索引+列分组

时间:2015-06-18 20:20:21

标签: python pandas

我有一个包含

列的数据框
  1. USER_ID
  2. item_bought
  3. 这里user_id是df的索引。我想通过user_id和item_bought进行分组,并为用户获取项目明智的计数。我该怎么做。

    由于

3 个答案:

答案 0 :(得分:31)

这应该有效:

>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2'])
>>> df['ind1'] = list('AAABCC')
>>> df['ind2'] = range(6)
>>> df.set_index(['ind1','ind2'], inplace=True)
>>> df

           col1  col2
ind1 ind2            
A    0        3     2
     1        2     0
     2        2     3
B    3        2     4
C    4        3     1
     5        0     0


>>> df.groupby([df.index.get_level_values(0),'col1']).count()

           col2
ind1 col1      
A    2        2
     3        1
B    2        1
C    0        1
     3        1

我使用multiindex中的一个列时遇到了同样的问题。使用multiindex,你不能使用df.index.levels [0],因为它只有那个特定索引级别的不同值,并且很可能与整个数据帧的大小不同......

check http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_level_values.html - get_level_values"返回请求级别的标签值向量,等于索引的长度"

答案 1 :(得分:2)

import pandas as pd

import numpy as np

In [11]:

df = pd.DataFrame()

In [12]:

df['user_id'] = ['b','b','b','c']

In [13]:

df['item_bought'] = ['x','x','y','y']

In [14]:

df['ct'] = 1

In [15]:

df

Out[15]:
    user_id     item_bought     ct
0   b   x   1
1   b   x   1
2   b   y   1
3   c   y   1
In [16]:

pd.pivot_table(df,values='ct',index=['user_id','item_bought'],aggfunc=np.sum)

Out[16]:

user_id  item_bought
b        x              2
         y              1
c        y              1

答案 2 :(得分:1)

我遇到了同样的问题-导入了一堆数据,我想对作为索引的字段进行分组。我没有多重索引或爵士乐,也没有。

我发现问题在于我想要的字段是索引,所以起初我只是重置了索引-但这给了我一个我不需要的无用的索引字段。因此,我现在执行以下操作(两个级别的分组):

grouped = df.reset_index().groupby(by=['Field1','Field2'])

然后我可以通过多种方式将“分组”用于不同的报告

grouped[['Field3','Field4']].agg([np.mean, np.std])

(这就是我想要的,为我提供了Field4和Field3的平均值,并按Field1(索引)和Field2分组

对于您来说,如果您只想对每个用户的项目进行计数,则可以使用groupby在一行中编写代码,

df.reset_index().groupby(by=['user_id']).count()

如果您想做更多的事情,则可以(像我一样)创建“分组”,然后使用它。作为一个初学者,我发现更容易遵循这种方式。

请注意,“ reset_index”不在“适当位置”,因此不会弄乱您的原始数据框