Python 按索引分组+;熊猫专栏

Python 按索引分组+;熊猫专栏,python,pandas,Python,Pandas,我有一个包含列的数据框 用户id 你买的东西 这里user_id是df的索引。我想根据用户id和购买的物品进行分组,并获取用户的物品数量。我该怎么做呢 谢谢这应该可以: >>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2']) >>> df['ind1'] = list('AAABCC') >>> df['ind2'] = range(6) &g

我有一个包含列的数据框

  • 用户id
  • 你买的东西
  • 这里user_id是df的索引。我想根据用户id和购买的物品进行分组,并获取用户的物品数量。我该怎么做呢

    谢谢

    这应该可以:

    >>> 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中的一列时也遇到了同样的问题。对于多索引,您不能使用df.index.levels[0],因为它只有与该特定索引级别不同的值,并且很可能与整个数据帧的大小不同

    选中-get_level_values“返回所请求级别的标签值向量,等于索引的长度”

    从版本它更简单:

    作为by参数传递给DataFrame.groupby()的字符串现在可以引用列名或索引级别名称

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

    我想问题是我想要的字段是索引,所以首先我只是重置索引-但这给了我一个无用的索引字段,我不想要。因此,现在我做以下工作(两个级别的分组):

    然后,我可以对不同的报告以多种方式使用“分组”

    grouped[['Field3','Field4']].agg([np.mean, np.std])
    
    (这就是我想要的,给我Field4和Field3的平均值,按Field1(索引)和Field2分组

    对于您来说,如果您只想使用groupby在一个简单的行中计算每个用户的项目数,那么代码可以是

    df.reset_index().groupby(by=['user_id']).count()
    
    如果你想做更多的事情,那么你可以(像我一样)创建“分组”,然后使用它。作为初学者,我发现这样做更容易


    请注意,“重置索引”未“就位”,因此不会弄乱原始数据框

    您应该能够执行
    df.groupby([df.index,'item_bunded'])。apply(pd.Series.count(level=0))
    ,实际上不
    df.groupby([df.index,'item_bunded'])。count
    给你你想要的?为什么不使用这个作为答案?当我尝试按[df.index,''分组时,我遇到了一个错误:Grouper和axis必须相同长度对我来说不同的错误:
    TypeError:Unhabable type:'Int64Index'
    @EdChum,太棒了!它甚至没有文档记录,是吗?为什么会被否决?它完全符合他们的要求。它没有显示如何从索引+列到计数……在您的示例中,用户id是一列,只需重置索引
     df=df.reset_index()
    …然后您可以在数据透视中使用它。是否有方法也可以对
    pd.Series
    执行此操作?我尝试传递序列名称,但它会给出一个
    keyrerror
    。我的意思是,按一个索引级别和序列的值对序列进行分组。
    grouped = df.reset_index().groupby(by=['Field1','Field2'])
    
    grouped[['Field3','Field4']].agg([np.mean, np.std])
    
    df.reset_index().groupby(by=['user_id']).count()