根据第二列的唯一值计算 groupby 后列的总和

问题描述 投票:0回答:2

我有一个

dataframe
,其中有像
gp1, gp2, gp3, id, sub_id, activity

这样的列
usr gp2 gp3 id  sub_id  activity
1   IN  ASIA    1   1   1
1   IN  ASIA    1   2   1
1   IN  ASIA    2   9   0
2   IN  ASIA    3   4   1
2   IN  ASIA    3   5   1
2   IN  ASIA    4   6   1
2   IN  ASIA    4   7   0
2   IN  ASIA    4   8   0

我想通过在

usr, gp1, gp2
上分组来聚合上述数据框,并计算两列,一个是“帐户(id)”,这是每个组的唯一
id
的数量,然后是实际值(活动),即
Activity
基于每个独特的“id”。

for example, if id = 1, the activity sum would be 1 not 2

usr gp1 gp3 id  Activity
1   IN  ASIA    2   1
2   IN  ASIA    2   2

df.groupby(['usr', 'gp2', 'gp3']).agg({'id': pd.Series.nunique, 'activity': LOGIC_REQUIRED})
python pandas
2个回答
1
投票

使用

GroupBy.apply
对多个(依赖)列进行操作:

df.drop(columns='sub_id').groupby(['usr', 'gp2', 'gp3'])\
    .apply(lambda x: pd.DataFrame({'id': [x['id'].nunique()],
                                   'activity': [x[x.activity.ne(0)].drop_duplicates(subset='id')['activity'].sum()]})
           .set_index('id')).reset_index()

   usr gp2   gp3  id  activity
0    1  IN  ASIA   2         1
1    2  IN  ASIA   2         2

0
投票
import pandas as pd

df = pd.DataFrame({'usr':[1, 1, 1, 2, 2, 2, 2, 2],
          'gp2':['IN', 'IN', 'IN', 'IN', 'IN', 'IN', 'IN', 'IN'],
          'gp3':['ASIA', 'ASIA', 'ASIA', 'ASIA', 'ASIA', 'ASIA', 'ASIA', 'ASIA'],
          'id':[1, 1, 2, 3, 3, 4, 4, 4],
          'sub_id':[1, 2, 9, 4, 5, 6, 7, 8],
          'activity':[1, 1, 0, 1, 1, 1, 0, 0],          
          })

df = (df.groupby(['usr', 'gp2', 'gp3'])
        .agg({'id':'nunique'})
        .reset_index(level=['usr', 'gp2', 'gp3'])
        )
df['Activity'] = df.groupby(['usr', 'gp2', 'gp3']).ngroup().add(1)
   usr gp2   gp3  id  Activity
0    1  IN  ASIA   2         1
1    2  IN  ASIA   2         2
© www.soinside.com 2019 - 2024. All rights reserved.