在按其他列过滤和分组后计算列的总和
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
所以我基本上只考虑 role
是 senior
的行
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
我使用此代码首先根据特定列过滤掉我的数据框 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
所以我基本上只考虑 role
是 senior
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