利用Pandas高效计算DataFrame中指定日期前后数据总和

利用Pandas高效计算DataFrame中指定日期前后数据总和

本教程详细介绍了如何使用Pandas库高效处理DataFrame数据,根据每行中指定的日期,将日期列的数据分为“之前”和“之后”两部分,并分别计算这两部分的数值总和。通过数据重塑(melt)、条件判断(np.where)和分组聚合(groupby.sum)等操作,实现对复杂时间序列数据的灵活统计分析,适用于需要按特定时间点进行数据汇总的场景。

在处理包含时间序列数据的dataframe时,我们经常会遇到需要根据某个特定日期对数据进行分组汇总的需求。例如,在一个包含多个月份销售额的表格中,每行代表一个产品,并指定一个“参考日期”,我们需要计算该产品在参考日期“之前”和“之后”的销售总额。本教程将详细阐述如何利用pandas库的强大功能,优雅地解决这类问题。

场景描述

假设我们有一个DataFrame,其结构如下所示:

Code 列:代表唯一的标识符(如产品代码)。Date 列:每行一个特定的参考日期,用于划分时间段。其他列:以日期命名,存储对应日期下的数值(如销售额、库存量等)。

我们的目标是为每行数据,基于其Date列的值,计算所有日期列中早于Date的数值总和(Before)以及晚于或等于Date的数值总和(After),并将这两个总和作为新列添加到原始DataFrame中。

核心思路

解决此问题的关键在于数据重塑(Reshaping)、条件判断和分组聚合。具体步骤如下:

数据重塑(Melt):将宽格式的日期列转换为长格式,使得所有日期值列的数据都集中到一个“值”列中,同时保留原始的Code和Date列以及新的“变量”列(原日期列名)。数据类型统一:确保所有日期相关的列(包括Date和重塑后的“变量”列)的数据类型一致,以便进行比较。通常转换为字符串或日期时间类型。条件判断与分类:根据每行的Date值与重塑后的“变量”列(即原始的日期列名)进行比较,判断该变量属于“之前”还是“之后”的分类。分组聚合:按Code和新生成的“之前/之后”分类进行分组,并对“值”列进行求和。结果重塑(Unstack):将“之前/之后”分类从行索引转换为列,形成Before和After两列。合并结果:将计算出的Before和After列合并回原始DataFrame。

步骤详解与代码实现

首先,我们创建一个示例DataFrame来模拟上述场景:

import pandas as pdimport numpy as np# 创建示例DataFramedata = {    'Code': ['12345', '12346', '12347'],    '202001': [1000, 999, 1983],    '202002': [1001, 1000, 1984],    '202003': [1002, 1001, 1985],    '202004': [1003, 1002, 1986],    '202005': [1004, 1003, 1987],    '202006': [1005, 1003, 1988],    '202007': [3006, 1005, 1989],    '202008': [1007, 1006, 1990],    '202009': [1008, 1007, 1991],    '202010': [1009, 1008, 1992],    '202011': [1010, 1009, 1993],    '202012': [1011, 1010, 1994],    'Date': ['202004', '202006', '202010']}df = pd.DataFrame(data)print("原始DataFrame:")print(df)

核心处理代码:

# 1. 数据重塑 (melt)# 将除 'Code' 和 'Date' 以外的所有列转换为长格式tmp = df.melt(['Code', 'Date'])# 2. 数据类型统一# 确保 'Date' 列和 'variable' (原始日期列名) 列都是字符串类型,便于比较tmp = tmp.astype({'Date': str, 'variable': str})# 3. 条件判断与分类 (assign with np.where)# 比较 'Date' (每行的参考日期) 和 'variable' (当前数据点的日期)# 如果 'Date' 大于 'variable',则为 'Before',否则为 'After'tmp = tmp.assign(col=lambda d: np.where(d['Date'].gt(d['variable']), 'Before', 'After'))# 4. 分组聚合 (groupby.sum)# 按 'Code' 和新生成的 'col' (Before/After) 分组,并对 'value' 求和tmp = tmp.groupby(['Code', 'col'])['value'].sum()# 5. 结果重塑 (unstack)# 将 'col' 从行索引转换为列,形成 'Before' 和 'After' 两列# 并确保列顺序为 ['Before', 'After']tmp = tmp.unstack('col')[['Before', 'After']]# 6. 合并结果 (merge)# 将计算出的 'Before' 和 'After' 列合并回原始DataFrame# 使用 'Code' 列进行左连接,因为 'tmp' 的索引是 'Code'out = df.merge(tmp, left_on='Code', right_index=True, how='left')print("n处理后的DataFrame:")print(out)

输出结果:

原始DataFrame:    Code  202001  202002  202003  202004  202005  202006  202007  202008  202009  202010  202011  202012    Date0  12345    1000    1001    1002    1003    1004    1005    3006    1007    1008    1009    1010    1011  2020041  12346     999    1000    1001    1002    1003    1003    1005    1006    1007    1008    1009    1010  2020062  12347    1983    1984    1985    1986    1987    1988    1989    1990    1991    1992    1993    1994  202010处理后的DataFrame:    Code  202001  202002  202003  202004  202005  202006  202007  202008  202009  202010  202011  202012    Date  Before  After0  12345    1000    1001    1002    1003    1004    1005    3006    1007    1008    1009    1010    1011  202004    3003  110631  12346     999    1000    1001    1002    1003    1003    1005    1006    1007    1008    1009    1010  202006    5005   70482  12347    1983    1984    1985    1986    1987    1988    1989    1990    1991    1992    1993    1994  202010   17883   5979

注意事项

数据类型一致性:在进行日期比较时,确保Date列和所有日期命名列(在melt后变为variable列)的数据类型一致且可比较。本例中,将它们都转换为字符串类型,利用字符串的字典序比较特性来判断日期先后。如果日期格式更复杂(如包含日),建议使用pd.to_datetime将其转换为datetime类型进行比较,这样更严谨。“之前”和“之后”的定义:本方案中,np.where(d[‘Date’].gt(d[‘variable’]), ‘Before’, ‘After’)的逻辑是:如果Date(参考日期)严格大于variable(数据点日期),则算作“之前”;否则(即Date小于或等于variable),则算作“之后”。这意味着参考日期本身的数据点被包含在“之后”的总和中。如果需要不同的划分逻辑(例如,参考日期本身的数据点算作“之前”或单独处理),需要调整np.where的条件。列名处理:如果原始DataFrame中已经存在名为Before或After的列,在执行此操作前,可能需要先将其删除(使用df.drop()),以避免冲突。性能考虑:对于非常大的DataFrame,melt操作会显著增加DataFrame的行数。虽然Pandas的内部优化做得很好,但在极端情况下,应考虑其内存消耗。

总结

本教程提供了一种高效且灵活的方法,利用Pandas的melt、assign、groupby、unstack和merge等组合操作,实现了根据每行特定日期对DataFrame进行时间段划分并计算总和的功能。这种方法不仅代码简洁,而且逻辑清晰,能够很好地应对此类数据分析需求,极大地提高了数据处理的效率和灵活性。掌握这种数据重塑和聚合的技巧,对于进行复杂的时间序列数据分析至关重要。

以上就是利用Pandas高效计算DataFrame中指定日期前后数据总和的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1367116.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python如何操作Apache Cassandra?cassandra-driver优化
上一篇 2025年12月14日 07:08:04
Python函数怎样用装饰器实现函数缓存 Python函数 lru_cache 缓存的使用技巧​
下一篇 2025年12月14日 07:35:36

相关推荐

  • sublime怎么安装markdown预览插件_Sublime Markdown实时预览插件安装教程

    sublime怎么安装markdown预览插件_Sublime Markdown实时预览插件安装教程sublime怎么安装markdown预览插件_Sublime Markdown实时预览插件安装教程sublime怎么安装markdown预览插件_Sublime Markdown实时预览插件安装教程sublime怎么安装markdown预览插件_Sublime Markdown实时预览插件安装教程

    最直接的方式是通过Package Control安装MarkdownPreview或OmniMarkupPreviewer插件,先确保安装Package Control,再通过命令面板搜索并安装插件,最后使用快捷命令在浏览器中实时预览Markdown渲染效果。 在Sublime Text里安装Mar…

    2026年9月28日 • 用户投稿
    000
  • 立即登录Kook官网 _ 体验Kook网页版高清语音

    立即登录Kook官网 _ 体验Kook网页版高清语音立即登录Kook官网 _ 体验Kook网页版高清语音立即登录Kook官网 _ 体验Kook网页版高清语音立即登录Kook官网 _ 体验Kook网页版高清语音

    答案:Kook官网为https://kook.top/,支持多端同步登录、高清语音通话、频道管理及文字聊天;提供机器人接入、主题更换、表情贴纸和API扩展;基于WebSocket协议与Swoole技术保障低延迟稳定运行。 立即登录Kook官网体验Kook网页版高清语音?这是不少网友都关注的,接下来由…

    2026年9月28日 • 用户投稿
    100
  • MySQL 实现点餐系统的优惠活动管理功能

    MySQL 实现点餐系统的优惠活动管理功能MySQL 实现点餐系统的优惠活动管理功能MySQL 实现点餐系统的优惠活动管理功能MySQL 实现点餐系统的优惠活动管理功能

    MySQL 实现点餐系统的优惠活动管理功能 引言: 随着互联网的发展,餐饮行业也逐渐迈入了数字化的时代。点餐系统的出现,极大地方便了餐厅的经营和顾客的用餐体验。而在点餐系统中,优惠活动是吸引和留存顾客的重要手段之一。本文将介绍如何使用MySQL数据库实现点餐系统的优惠活动管理功能,并提供具体的代码示…

    2026年9月28日 • 用户投稿
    000
  • Excel数据怎么分组统计_Excel分类统计与汇总操作技巧

    Excel数据怎么分组统计_Excel分类统计与汇总操作技巧Excel数据怎么分组统计_Excel分类统计与汇总操作技巧Excel数据怎么分组统计_Excel分类统计与汇总操作技巧Excel数据怎么分组统计_Excel分类统计与汇总操作技巧

    数据透视表适合分析大量数据,按行和值字段自动汇总;组合功能可手动分级显示排序后的数据;SUMIF、COUNTIF等函数实现条件统计;分类汇总功能一键插入汇总行。根据场景选择方法可提升效率。 在Excel中进行数据分组统计和分类汇总,是日常工作中处理报表、分析数据的常用操作。掌握这些技巧能大幅提升工作…

    2026年9月28日 • 用户投稿
    000
  • 「理想同学」的进化史:从 AI 助手到智能体的自研之路

    如果要选出最早凭借座舱功能占领用户心智的一家造车新势力,答案或许是理想。 ” 冰箱彩电大沙发 ” 是理想最被人所知的卖点。但抛开这些精准的硬件定义,作为未来用户智驾空间与娱乐的第三空间,座舱里只有这些是远远不够的。智能化尤其是座舱空间的智能化,已经成为车企的核心卖点。 202…

    2026年9月28日
    000
  • 10级宝石速成指南:碎片收集、活动冲刺与合成精炼全解析

    10级宝石速成指南:碎片收集、活动冲刺与合成精炼全解析10级宝石速成指南:碎片收集、活动冲刺与合成精炼全解析10级宝石速成指南:碎片收集、活动冲刺与合成精炼全解析10级宝石速成指南:碎片收集、活动冲刺与合成精炼全解析

    一、碎片获取:多元渠道高效囤积 日常任务与限时活动:稳赚不赔的资源库 参与各类限时挑战、击败指定BOSS、解锁隐藏成就,都是获得宝石碎片的黄金途径!关键提示:密切关注游戏公告,双倍掉落时段务必全力投入,效率直接翻倍! 神秘商人:不定期出现的宝藏来源 世界地图中随机刷新的宝石商人,可用金币或镔铁兑换碎…

    2026年9月28日 • 用户投稿
    000
  • DeepSeek的”历史记录”功能如何使用?能否找回之前的对话?

    DeepSeek的”历史记录”功能如何使用?能否找回之前的对话?DeepSeek的”历史记录”功能如何使用?能否找回之前的对话?DeepSeek的”历史记录”功能如何使用?能否找回之前的对话?DeepSeek的”历史记录”功能如何使用?能否找回之前的对话?

    要开启deepseek的历史记录功能,需登录账号后进入“设置”或“个人资料”页面,找到“历史记录”选项并启用;该功能可保存对话内容,但保存时长和条数可能受限,具体策略需参考官方文档;为便于查找,可通过关键词、日期等搜索历史记录,并建议使用标签分类管理。 ☞☞☞点击问小白轻松解答疑惑,点亮您的每一天!…

    2026年9月28日 • 用户投稿
    000
  • DLL攻击漫谈

    DLL攻击漫谈DLL攻击漫谈DLL攻击漫谈DLL攻击漫谈

    动态链接库(dll)可以作为执行任意代码的接口,并帮助恶意行为者实现其目标。dll是microsoft共享库的实现方式,通常以dll为文件扩展名,并且它们也是pe文件,与exe文件结构相同。 DLL可以包含PE文件支持的任何类型的内容,这些内容可能包括代码、资源或数据的任意组合。DLL的主要用途是在…

    2026年9月28日 • 用户投稿
    100
  • pr怎么看视频是什么序列号?pr视频序列号可以改吗?

    pr怎么看视频是什么序列号?pr视频序列号可以改吗?pr怎么看视频是什么序列号?pr视频序列号可以改吗?pr怎么看视频是什么序列号?pr视频序列号可以改吗?pr怎么看视频是什么序列号?pr视频序列号可以改吗?

    开头:在Premiere Pro(简称PR)中,序列是编辑工作的核心。了解如何查看和管理序列的设置,是保证项目流畅、输出正确的基础。本文将简单介绍如何查看序列号及修改序列设置。 一、pr怎么看视频是什么序列号? 在PR中,“序列号”通常不是指一个单独的数字编码,而是指“序列设置”的各项参数。这些参数…

    2026年9月28日 • 用户投稿
    000
  • uc浏览器如何阻止自动更新_UC浏览器关闭后台自动更新版本设置

    uc浏览器如何阻止自动更新_UC浏览器关闭后台自动更新版本设置uc浏览器如何阻止自动更新_UC浏览器关闭后台自动更新版本设置uc浏览器如何阻止自动更新_UC浏览器关闭后台自动更新版本设置uc浏览器如何阻止自动更新_UC浏览器关闭后台自动更新版本设置

    首先关闭UC浏览器内自动更新设置,进入“我的”-“设置”-“关于UC”关闭自动更新;再通过手机应用管理限制其后台数据、自启动权限;接着在通知管理中关闭所有通知权限;最后在应用商店中设置手动更新并忽略UC浏览器更新。 如果您在使用UC浏览器时发现应用频繁自动更新,导致流量消耗增加或版本变动影响使用习惯…

    2026年9月28日 • 用户投稿
    200
  • 深入探讨Linux文件系统的组织方式

    深入探讨Linux文件系统的组织方式深入探讨Linux文件系统的组织方式深入探讨Linux文件系统的组织方式深入探讨Linux文件系统的组织方式

    标题:深入探讨Linux文件系统的组织方式 在Linux系统中,文件系统是存储、组织和管理数据的关键部分。了解Linux文件系统的组织方式对于系统管理员和开发人员来说至关重要。本文将深入探讨Linux文件系统的组织方式,包括其目录结构、特点和基本操作,并提供具体的代码示例进行演示。 1. Linux…

    2026年9月28日 • 用户投稿
    000
  • REST API设计原则:理解无状态性与持久化数据管理

    REST API设计原则:理解无状态性与持久化数据管理REST API设计原则:理解无状态性与持久化数据管理REST API设计原则:理解无状态性与持久化数据管理REST API设计原则:理解无状态性与持久化数据管理

    在REST API设计中,跨不同API调用维护服务器端变量(如用户列表)的内存状态与REST的无状态原则相悖。RESTful服务应将每个请求视为独立的事务,不依赖服务器端会话状态。对于需要持久化的数据,应采用数据库、文件系统等外部存储机制,而非在内存中直接维护,以确保系统的可伸缩性、可靠性和一致性。…

    2026年9月28日 • 用户投稿
    200
  • 多重人生大餐怎么解锁 解锁大餐方法分享

    多重人生大餐怎么解锁 解锁大餐方法分享多重人生大餐怎么解锁 解锁大餐方法分享多重人生大餐怎么解锁 解锁大餐方法分享多重人生大餐怎么解锁 解锁大餐方法分享

    多重人生大餐解锁方式详解如下:​ 1、完成“食材图谱”主线任务,搜集并登记10种基础食材,成功激活初级大餐食谱的使用权限。​ 2、将厨房升级至二级,通过消耗一定数量的金属与聚合物完成空间扩建,为后续高级大餐的制作提供必要条件。​ 3、前往“迷雾森林”区域进行探索,寻找隐藏其中的“美食图鉴”,成功获取…

    2026年9月28日 • 用户投稿
    000
  • 荣耀Magic8和新平板官宣 首批搭载第五代骁龙8至尊版

    荣耀Magic8和新平板官宣 首批搭载第五代骁龙8至尊版荣耀Magic8和新平板官宣 首批搭载第五代骁龙8至尊版荣耀Magic8和新平板官宣 首批搭载第五代骁龙8至尊版荣耀Magic8和新平板官宣 首批搭载第五代骁龙8至尊版

    9月25日,cnmo获悉,荣耀手机官方正式发布消息,宣布荣耀magic8系列以及荣耀magicpad3 pro平板将率先搭载高通最新推出的第五代骁龙8至尊版移动平台。 荣耀Magic7 Pro 此前多方爆料显示,荣耀Magic8系列将配备超过7000mAh的大容量电池,支持100W有线快充和80W无…

    2026年9月28日 • 用户投稿
    100
  • 怎么注册微信公众号_微信公众号注册流程与技巧教程

    怎么注册微信公众号_微信公众号注册流程与技巧教程怎么注册微信公众号_微信公众号注册流程与技巧教程怎么注册微信公众号_微信公众号注册流程与技巧教程怎么注册微信公众号_微信公众号注册流程与技巧教程

    注册微信公众号需先选对类型,个人选订阅号,企业若需支付等功能应选服务号;准备未注册的邮箱、身份证或营业执照、对公账户等材料;注意邮箱激活、信息填写准确及认证细节,避免因资料不清或信息错误导致审核失败。 注册微信公众号,其实核心步骤就那么几步:访问微信公众平台官网,选择注册类型(个人/企业),填写基本…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么在侧边栏中隐藏特定的文件类型_侧边栏文件过滤设置

    sublime怎么在侧边栏中隐藏特定的文件类型_侧边栏文件过滤设置sublime怎么在侧边栏中隐藏特定的文件类型_侧边栏文件过滤设置sublime怎么在侧边栏中隐藏特定的文件类型_侧边栏文件过滤设置sublime怎么在侧边栏中隐藏特定的文件类型_侧边栏文件过滤设置

    要隐藏Sublime Text侧边栏中的特定文件类型,需修改用户或项目设置中的”folder_exclude_patterns”和”file_exclude_patterns”数组。首先在全局设置中添加如”.git”、&#822…

    2026年9月28日 • 用户投稿
    100
  • MySQL数据库备份与灾备方案的项目经验总结

    MySQL数据库备份与灾备方案的项目经验总结MySQL数据库备份与灾备方案的项目经验总结MySQL数据库备份与灾备方案的项目经验总结MySQL数据库备份与灾备方案的项目经验总结

    MySQL数据库备份与灾备方案的项目经验总结 在项目中,数据库的备份和灾备方案是一项非常重要的工作内容。MySQL作为一种常用的关系型数据库管理系统,其备份和灾备方案的制定和实施是确保数据安全性和可用性的关键。在过去的项目实施中,我积累了一些经验,并在此总结如下。 一、备份策略的制定制定合理的备份策…

    2026年9月28日 • 用户投稿
    000
  • 使用单个循环优化 Java 代码:替代多个循环的策略

    使用单个循环优化 Java 代码:替代多个循环的策略使用单个循环优化 Java 代码:替代多个循环的策略使用单个循环优化 Java 代码:替代多个循环的策略使用单个循环优化 Java 代码:替代多个循环的策略

    本文旨在帮助开发者优化 Java 代码,特别是当遇到需要多次遍历同一数据集以查找不同类型数据时。我们将探讨如何使用单个循环和标志变量来替代多个循环,从而提高代码的效率和可读性,并提供多种优化策略,包括使用布尔标志、数组和辅助类,以及性能考量。 在处理数据时,经常会遇到需要从同一数据集中提取不同类型的…

    2026年9月28日 • 用户投稿
    000
  • Linux文件系统架构详解

    Linux文件系统架构详解Linux文件系统架构详解Linux文件系统架构详解Linux文件系统架构详解

    Linux文件系统架构详解 Linux作为一款开源的操作系统,其文件系统架构扮演着至关重要的角色。文件系统是操作系统中负责管理数据的重要部分,Linux系统中有多种不同的文件系统,每种文件系统都有其特定的优势和用途。在本文中,我们将详细解析Linux文件系统的架构,从文件系统的基本概念、目录结构到具…

    2026年9月28日 • 用户投稿
    700
  • 荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起

    荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起

    7月2日,荣耀推出全新旗舰轻薄本magicbook art 14 2025。该产品整机重量1kg,闭合状态厚度1cm,起售价8499元(国补后6799.2元起),即日开售。 该产品配备1600nit OLED绿洲护眼屏:14.6英寸触控屏支持4320Hz高频PWM调光、100% DCI-P3色域及Δ…

    2026年9月28日 • 用户投稿
    1200

发表回复

登录后才能评论
关注微信