首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫群与value_counts

熊猫群与value_counts
EN

Stack Overflow用户
提问于 2018-08-11 12:43:26
回答 1查看 8.8K关注 0票数 6

我希望在MultiIndex中按某个级别对数据进行分组(使用MultiIndex),每一列的不同值(我猜是这样)。使用groupby(level=参数处理多个索引,但apply引发一个ValueError

原始数据:

代码语言:javascript
复制
>>> df = pd.DataFrame(np.random.choice(list('ABC'), size=(10,5)),
                 columns=['c1','c2','c3','c4','c5'], 
                 index=pd.MultiIndex.from_product([['foo', 'bar'], 
                                                   ['w','y','x','y','z']]))



      c1 c2 c3 c4 c5
foo w  C  C  B  A  A
    y  A  A  C  B  A
    x  A  B  C  C  C
    y  A  B  C  C  C
    z  A  C  B  C  B
bar w  B  C  C  A  C
    y  A  A  C  A  A
    x  A  B  B  B  A
    y  A  A  C  A  B
    z  A  B  B  C  B

我想要的:

代码语言:javascript
复制
       c1  c2  c3  c4  c5
foo A   4   2   0   3   2
    B   1   2   2   1   2
    C   0   1   3   1   1
bar A   4   1   0   1   2
    B   0   2   2   1   1
    C   1   2   3   3   2

我试着做:

代码语言:javascript
复制
>>> df.groupby(level=0).apply(pd.value_counts)

ValueError: could not broadcast input array from shape (5,5) into shape (5)

我可以自己动手,但我认为这一定是一个更明显的方法。

代码语言:javascript
复制
groups = [g.apply(pd.value_counts).fillna(0) for n, g in df.groupby(level=0)]
index = df.index.get_level_values(0).unique()
correct_result = pd.concat(groups, keys=index)   # THIS WORKS AS EXPECTED

我的意思是,这写起来没那么长,但我觉得我在重新发明轮子。这种操作不是由群函数完成的吗?

除了进行拆分--应用--结合我自己之外,还有更简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 12:49:34

使用stack表示MultiIndex Series,然后使用SeriesGroupBy.value_counts,最后使用unstack表示DataFrame

代码语言:javascript
复制
np.random.seed(123)

df = pd.DataFrame(np.random.choice(list('ABC'), size=(10,5)),
                 columns=['c1','c2','c3','c4','c5'], 
                 index=pd.MultiIndex.from_product([['foo', 'bar'], 
                                                   ['w','y','x','y','z']]))
print (df)
      c1 c2 c3 c4 c5
foo w  C  B  C  C  A
    y  C  C  B  C  B
    x  C  B  A  B  C
    y  B  A  C  A  B
    z  C  B  A  A  A
bar w  A  B  C  A  C
    y  A  A  B  A  B
    x  A  A  A  C  B
    y  B  C  C  C  B
    z  A  A  C  B  A

df1 = df.stack().groupby(level=[0,2]).value_counts().unstack(1, fill_value=0)
print (df1)
       c1  c2  c3  c4  c5
bar A   4   3   1   2   1
    B   1   1   1   1   3
    C   0   1   3   2   1
foo A   0   1   2   2   2
    B   1   3   1   1   2
    C   4   1   2   2   1
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51799818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档