按熊猫分组后按条件计数

df = pd.DataFrame({
    'id':[1,1,1,2,2,2],
    'item':[200,200,201,333,333,334],
    'page':[1,1,2,3,2,2]
})

我想像这样将df转换为df1。

df = pd.DataFrame({
    'id':[1,1,2,2,2],
    'item':[200,201,333,333,334],
    'page':[1,2,3,2,2],
    'page1_cnt':[2,0,0,0,0]
})

问题:如果page == 1的groupby的大小

这是我的方式。我可以得到更多的pythonic方式吗?

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'id':[1,1,1,2,2,2],
    'item':[200,200,201,333,333,334],
    'page':[1,1,2,3,2,2]
})

df['pageCnt'] = df.groupby(['id','item','page']).page.transform('size')
df['page1Cnt'] = np.where(df.groupby(['id','item']).page.apply(lambda x: x==1), df.pageCnt, 0)
斯科特·波士顿

让我们使用这种单行代码,如果等于1,它将创建一列'page1_cnt'作为布尔True,并使用mul(1)将其转换为整数,然后对分组并求和page1_cnt的整数:

df.assign(page1_cnt=df.page.eq(1).mul(1))\
  .groupby(['id','item','page'], as_index=False)['page1_cnt'].sum()

输出:

   id  item  page  page1_cnt
0   1   200     1          2
1   1   201     2          0
2   2   333     2          0
3   2   333     3          0
4   2   334     2          0

或者我们可以使用set_index和sum与参数级别:

df.assign(page1_cnt=df.page.eq(1).mul(1))\
  .set_index(['id','item','page'])\
  .sum(level=[0,1,2]).reset_index()

输出:

   id  item  page  page1_cnt
0   1   200     1          2
1   1   201     2          0
2   2   333     3          0
3   2   333     2          0
4   2   334     2          0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章