如何在Pandas中按条件列求和及统计Cranes总访问量
技术问题一:如何在Pandas中结合另一条件列计算某列的总和?
这是Pandas里非常常见的需求,我给你几个实用的实现方式:
布尔索引直接求和:如果只想筛选满足某列条件的行,再对目标列求和,直接用布尔表达式过滤就行。比如要计算
priority列为yes时visits列的总和:total = df[df['priority'] == 'yes']['visits'].sum()分组求和(按条件列):如果需要按条件列分组后,分别计算每组目标列的总和,用
groupby更合适:sum_by_condition = df.groupby('priority')['visits'].sum()多条件组合求和:要是有多个筛选条件,用
&(逻辑且)或|(逻辑或)组合布尔表达式,记得给每个条件加括号:total = df[(df['priority'] == 'yes') & (df['birds'] == 'Cranes')]['visits'].sum()
技术问题二:统计鸟类Cranes的总访问次数并输出指定格式
你当前的groupby操作之所以会出现age列,是因为sum()默认会对DataFrame里所有数值类型的列进行求和运算(你的age和visits都是数值列)。要得到你想要的输出,我们可以分步处理:
1. 筛选Cranes的访问记录
先提取birds列为Cranes的行,只保留birds和visits两列,避免其他列干扰:
cranes_data = df[df['birds'] == 'Cranes'][['birds', 'visits']]
2. 添加总计行
接下来我们创建一行总计数据,把Cranes的所有visits加起来,再和原始记录合并:
# 生成总计行 total_row = pd.DataFrame({'birds': ['Total'], 'visits': [cranes_data['visits'].sum()]}) # 合并原始数据和总计行 result = pd.concat([cranes_data, total_row], ignore_index=True)
3. 输出指定格式
现在打印结果就能得到你想要的样式了,用to_string(index=False)可以去掉默认的索引列:
print(result.to_string(index=False))
执行后输出如下:
birds visits Cranes 2 Cranes 4 Cranes 4 Cranes 2 Total 12
补充:如果只想对指定列分组求和
要是你只是想避免age列被求和,而非保留原始记录,那可以在groupby后明确指定要计算的列:
# 只对visits列分组求和,不会包含age列 g = df.groupby(['birds','visits'])['visits'].sum()
不过这个结果是分组后的求和值,和你想要的原始记录+总计的需求不太一样,所以还是前面的分步方法更贴合你的期望。
内容的提问来源于stack exchange,提问作者Koustav
相关产品推荐
相关产品推荐

