在按其他列过滤和分组后计算列的总和

calculate sum of a column after filtering by and grouping on other columns

我使用此代码首先根据特定列过滤掉我的数据框 role

接下来,我计算 value 列的总和并将其添加到 newColumn。现在,我在 newCol 的所有行中得到相同的值。但是,现在我想按 id col 的每个值的总和进行分组。我怎样才能做到这一点?

    mask = chunk["role"].eq("senior")
    chunk.loc[mask, 'newColumn'] = chunk.loc[mask, 'value'].sum()

df

id    role      value
1     junior    2
1     senior    3
1     senior    4
2     junior    2
2     senior    6

期望的输出:

id    role      value     sum
1     junior    2
1     senior    3         7
1     senior    4         7
2     junior    2
2     senior    6         8
2     senior    2         8

所以我基本上只考虑 rolesenior

的行

IIUC,你可以尝试 query 其中 role 值是 senior 然后使用 groupby.transform

df['sum'] = (df.query('role == "senior"')
             .groupby('id')['value'].transform('sum'))
print(df)

   id    role  value  sum
0   1  junior      2  NaN
1   1  senior      3  7.0
2   1  senior      4  7.0
3   2  junior      2  NaN
4   2  senior      6  8.0
5   2  senior      2  8.0

您应该考虑添加数据框示例,以便每个人都能更轻松地提供帮助。检查下面的示例 - 这是您提问时应该给出的 df 结构。

像这样的东西应该可以工作:

# Sample of the data frame
>>> df = pd.DataFrame({
       'id': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2},
       'role': {0: 'junior', 1: 'senior', 2: 'senior', 3: 'junior', 4: 'senior'},
       'value': {0: 2, 1: 3, 2: 4, 3: 2, 4: 6}})

# Massaging the data to achieve desired result
>>> print(df
        .merge(df.groupby(['id','role'], as_index=False)[['value']]
        .agg(sum), on=['id','role'])
        .rename({'value_x': 'value', 'value_y': 'sum'}, axis=1))


id  role    value   sum
0   1   junior  2   2
1   1   senior  3   7
2   1   senior  4   7
3   2   junior  2   2
4   2   senior  6   6