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

花韻仙語
发布: 2025-10-27 10:05:47
原创
229人浏览过

累计求和: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”表示结束)的索引来实现。

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

创客贴设计51
查看详情 创客贴设计
# 确定每个分段的起始索引
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中的分段数据,并获得所需的累计聚合结果。

以上就是累计求和:Pandas DataFrame分段数据处理与聚合的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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