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 .....
解决方案
代码问题说明
你的代码有两个核心问题:
df_sum = pd.DataFrame是把变量指向了DataFrame类,而非创建空的DataFrame实例,正确写法是df_sum = pd.DataFrame()- 迭代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)
代码解释
- 布尔索引筛选:
(df['type'] == 'A') & (df['year'] < 1999)生成布尔数组,筛选出所有满足条件的行 - 分组求和:
.groupby('id')['num'].sum()按id分组后,对每个组的num列求和 - 重置索引:
.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
相关产品推荐
相关产品推荐

