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] 删除。
我来说两句