0

0

累计求和:Pandas DataFrame分段数据处理与聚合

花韻仙語

花韻仙語

发布时间:2025-10-27 10:05:47

|

254人浏览过

|

来源于php中文网

原创

累计求和:pandas dataframe分段数据处理与聚合

本教程详细阐述了如何在Pandas DataFrame中处理包含多个逻辑分段的数据,并对每个分段内符合特定条件的数值进行累计求和。文章通过具体示例代码,展示了如何识别数据分段、提取子DataFrame、执行条件过滤,并使用累加器变量实现最终的单一总和,从而避免了获取多个独立求和结果的常见问题

引言:处理分段数据与累计求和的挑战

在数据分析实践中,我们经常会遇到DataFrame中包含多个逻辑上独立的数据块或“分段”的情况。这些分段可能由特定的标记行(如“START”和“END”)分隔,而我们的任务通常是对每个分段内符合特定条件的数值进行聚合操作,例如求和。一个常见的挑战是,如果在循环中直接对每个分段的结果进行求和并打印,我们会得到多个独立的和,而不是一个最终的累计总和。本教程将指导您如何有效地解决这一问题,实现分段数据的精确累计求和。

示例数据准备

首先,我们构建一个模拟的Pandas DataFrame,它包含了多个逻辑分段。每个分段由Type列中的特定值(例如“Dog”作为开始,“Cat”作为结束)定义。

import pandas as pd

# 示例数据
data = {
    'Type': ['Dog', '', '', 'Cat', '', '', 'Dog', '', '', 'Cat'],
    'breed': ['', 'Wolf', 'bork', '', '', '', '', 'Wolf', 'bork', ''],
    'Age': [20, 21, 19, 18, 20, 21, 19, 15, 16, 0]
}
data = pd.DataFrame(data)
print("原始DataFrame:")
print(data)

输出:

原始DataFrame:
  Type breed  Age
0  Dog         20
1       Wolf   21
2       bork   19
3  Cat         18
4              20
5              21
6  Dog         19
7       Wolf   15
8       bork   16
9  Cat          0

识别数据分段的起始与结束

接下来,我们需要确定每个逻辑分段的起始和结束索引。这可以通过查找Type列中特定标记值(如“Dog”表示开始,“Cat”表示结束)的索引来实现。

TextIn Tools
TextIn Tools

是一款免费在线OCR工具,包含文字识别、表格识别,PDF转文件,文件转PDF、其他格式转换,识别率高,体验好,免费。

下载
# 确定每个分段的起始索引
Start = (data['Type'].index[data['Type'] == 'Dog']).astype(int)
# 确定每个分段的结束索引
End = (data['Type'].index[data['Type'] == 'Cat']).astype(int)

print("\n分段起始索引 (Start):", Start)
print("分段结束索引 (End):", End)

输出:

分段起始索引 (Start): Int64Index([0, 6], dtype='int64')
分段结束索引 (End): Int64Index([3, 9], dtype='int64')

解决“多个值而非单一总和”的问题

原始问题中,用户在循环内对每个分段的求和结果进行打印,导致输出了多个独立的和。要获得一个单一的累计总和,我们需要引入一个累加器变量,并在循环中不断更新它。

以下是实现累计求和的步骤:

  1. 初始化累加器: 创建一个变量(例如total_sum),并将其初始化为0。
  2. 遍历分段: 使用enumerate函数遍历Start索引列表,同时获取当前分段的索引和起始位置。
  3. 提取子DataFrame: 利用iloc基于整数位置索引来切片原始DataFrame,从而获取当前分段的数据。
  4. 条件过滤与类型转换: 在子DataFrame中,使用query()方法过滤出breed列为“Wolf”的行,并选择Age列。为了确保求和的正确性,使用pd.to_numeric()将Age列转换为数值类型。
  5. 分段求和与累加: 对过滤后的Age系列调用.sum()方法,得到当前分段的求和结果,然后将其加到total_sum变量中。
  6. 输出最终结果: 在循环结束后,打印total_sum,这将是所有分段中符合条件的数值的累计总和。

完整解决方案代码

import pandas as pd

# 示例数据
data = {
    'Type': ['Dog', '', '', 'Cat', '', '', 'Dog', '', '', 'Cat'],
    'breed': ['', 'Wolf', 'bork', '', '', '', '', 'Wolf', 'bork', ''],
    'Age': [20, 21, 19, 18, 20, 21, 19, 15, 16, 0]
}
data = pd.DataFrame(data)

# 确定每个分段的起始索引
Start = (data['Type'].index[data['Type'] == 'Dog']).astype(int)
# 确定每个分段的结束索引
End = (data['Type'].index[data['Type'] == 'Cat']).astype(int)

# 初始化一个累加器变量,用于存储所有分段的总和
total_sum = 0

# 遍历每个分段
for index, value in enumerate(Start):
    # 提取当前分段的子DataFrame
    # 注意:End[index] 确保了Start和End索引的对应关系
    Frip = data.iloc[int(value) : End[index]]

    # 在当前分段中,过滤出 'breed' 为 'Wolf' 的行,并选择 'Age' 列
    # 将 'Age' 列转换为数值类型,然后求和
    section_sum = pd.to_numeric(Frip.query('breed == "Wolf"').Age).sum()

    # 将当前分段的和累加到 total_sum
    total_sum += section_sum

# 打印最终的累计总和
print("\n所有分段中 'Wolf' 类型的累计年龄总和:", total_sum)

预期输出

所有分段中 'Wolf' 类型的累计年龄总和: 36

注意事项与总结

  1. 累加器变量的重要性: 实现累计求和的关键在于使用一个在循环外部初始化的累加器变量 (total_sum),并在循环内部不断更新它。
  2. 索引对齐: 确保Start和End索引列表的长度和顺序是匹配的,以便Frip = data.iloc[int(value) : End[index]]能够正确地切分出每个逻辑分段。在实际应用中,如果分段定义复杂,可能需要更健壮的逻辑来匹配起始和结束索引。
  3. 数据类型转换: 使用pd.to_numeric()是一个好习惯,可以确保在执行数学运算前,目标列的数据类型是正确的,从而避免潜在的TypeError。
  4. query()方法的便利性: DataFrame.query()提供了一种简洁且可读性高的方式来根据条件过滤DataFrame的行。
  5. 灵活性: 这种模式非常灵活,您可以轻松修改过滤条件(例如,breed == "Dog")或聚合操作(例如,.mean()、.max())以适应不同的分析需求。

通过遵循上述方法,您可以高效且准确地处理Pandas DataFrame中的分段数据,并获得所需的累计聚合结果。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

296

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

521

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

188

2025.08.29

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
R 教程
R 教程

共45课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号