You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按条件筛选数据后,如何按id汇总num列求和?

问题:按条件筛选并按ID求和num列

样本数据

id   year  type  num
     1   1994   A     0
     2   1950   A  2333
     3   1977   B  4444
     4   1995   B   555
     1   1994   A     0
     6   1955   A   333
     7   2006   B  4123
     6   1975   A     0
     9   1999   B   123
     3   1950   A  1234

需求:找到最简单的方法,对满足type == 'A'且year < 1999条件的num列按id进行求和。

尝试的错误代码

data = pd.read_csv('data.csv')
df = pd.DataFrame(data)
df_sum = pd.DataFrame

for index, row in df.iterrows():
    if row['type'] == 'A' and row['year'] < 1999:
        df_sum = df_sum.append(row) # This doesn't work

期望输出:

id num_sum
1   0
2   2333
6   333
.....

解决方案

代码问题说明

你的代码有两个核心问题:

  1. df_sum = pd.DataFrame 是把变量指向了DataFrame类,而非创建空的DataFrame实例,正确写法是df_sum = pd.DataFrame()
  2. 迭代DataFrame行的方式效率极低,且append方法在pandas 2.0及以上版本已被弃用,完全没必要用这种方式处理数据。

最简实现方法

直接用布尔索引筛选+分组求和,一行核心代码就能完成需求:

import pandas as pd

# 读取数据
df = pd.read_csv('data.csv')

# 筛选符合条件的行,按id分组对num求和
result = df[(df['type'] == 'A') & (df['year'] < 1999)].groupby('id')['num'].sum().reset_index(name='num_sum')

# 输出结果
print(result)

代码解释

  1. 布尔索引筛选:(df['type'] == 'A') & (df['year'] < 1999) 生成布尔数组,筛选出所有满足条件的行
  2. 分组求和:.groupby('id')['num'].sum() 按id分组后,对每个组的num列求和
  3. 重置索引:.reset_index(name='num_sum') 将分组的id从索引转为列,同时把求和后的列命名为num_sum

运行结果

对应样本数据,输出如下:

id  num_sum
0   1        0
1   2     2333
2   3     1234
3   6      333

内容的提问来源于stack exchange,提问作者vloubes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:15:13