Pandas DataFrame行求和技巧:处理混合数据类型并避免0值结果

Pandas DataFrame行求和技巧:处理混合数据类型并避免0值结果

在pandas dataframe中对包含混合数据类型的行进行数值求和时,直接使用`df.sum(axis=1, numeric_only=true)`可能因`numeric_only`参数的工作机制而导致0值结果。本文将深入解析此问题,并提供一种健壮的解决方案:通过结合`pd.to_numeric`与`errors=’coerce’`对非数值元素进行预处理,确保只有可转换的数值参与求和,并进一步展示如何将求和结果格式化为时间间隔。

理解df.sum(numeric_only=True)的行为

当我们需要对Pandas DataFrame的行进行求和,并且行中包含字符串、列表等非数值类型时,一个常见的做法是使用df.sum(axis=1, numeric_only=True)。然而,如果您的DataFrame中包含类似“No hours logged”这样的字符串,或者以字符串形式存储的数字(如“29160”),即使使用了numeric_only=True,求和结果也可能出乎意料地显示为0.0。

这背后的原因是numeric_only参数的工作方式。根据Pandas官方文档,numeric_only=True参数用于“只包含浮点型、整型、布尔型列”。这意味着Pandas在执行求和操作前,会检查整个列的数据类型。如果某一列中包含任何非数值类型(例如,即使只有一个单元格是字符串,整个列的dtype也可能被推断为object),那么这一整列都将被numeric_only=True排除在计算之外。

在我们的示例数据中,像’2023-11-28’这样的日期列,虽然大部分单元格看起来是数字的字符串,但它们实际存储的是字符串(’29160’),甚至有明确的非数字字符串(’No hours logged’)和列表('[10:02, Odd number: missing entry]’)。因此,这些列的dtype很可能是object,从而被numeric_only=True忽略,导致最终的total_hours列全部为0.0。

解决方案:使用pd.to_numeric进行数据预处理

要正确地对包含混合数据类型的行进行数值求和,我们需要在求和之前,将每个单元格中可转换为数字的值进行转换,并将不可转换的值优雅地处理掉。pd.to_numeric函数结合errors=’coerce’参数是解决此问题的理想工具

pd.to_numeric(x, errors=’coerce’)的工作原理如下:

它会尝试将x(可以是Series或单个值)转换为数值类型。如果转换成功,则返回对应的数值。如果转换失败(例如,遇到’No hours logged’或'[10:02, Odd number: missing entry]’),并且errors参数设置为’coerce’,那么该值将被替换为NaN(Not a Number)。NaN值在求和时会被默认忽略,从而不影响最终的数值结果。

实施步骤与示例代码

首先,我们准备示例数据:

import pandas as pddata = {    'id': {0: 514, 1: 2414, 2: 3225, 3: 3434, 4: 3864, 5: 4716, 6: 5793},    'name': {0: 'alexis', 1: 'donald', 2: 'mackenzie', 3: 'louisa', 4: 'olga', 5: 'rick', 6: 'roberta'},    '2023-11-28': {0: 'No hours logged', 1: '29160', 2: '28500', 3: '25380', 4: '15600', 5: '30180', 6: '29220'},    '2023-11-29': {0: 'No hours logged', 1: '29160', 2: '28620', 3: '18840', 4: '19080', 5: '28800', 6: '29220'},    '2023-11-30': {0: 'No hours logged', 1: '28860', 2: '28560', 3: '26040', 4: '14400', 5: '28740', 6: '29460'},    '2023-12-01': {0: 'No hours logged', 1: '28620', 2: '28620', 3: 'No hours logged', 4: '13800', 5: '28620', 6: '29280'},    '2023-12-02': {0: 'No hours logged', 1: '[10:02, Odd number: missing entry]', 2: '28980', 3: '25560', 4: '5220', 5: '28680', 6: '29340'},    '2023-12-03': {0: 'No hours logged', 1: 'No hours logged', 2: 'No hours logged', 3: 'No hours logged', 4: '17820', 5: 'No hours logged', 6: 'No hours logged'},    '2023-12-04': {0: 'No hours logged', 1: 'No hours logged', 2: 'No hours logged', 3: 'No hours logged', 4: 'No hours logged', 5: 'No hours logged', 6: 'No hours logged'},    '2023-12-05': {0: 'No hours logged', 1: '28860', 2: '28740', 3: '24900', 4: '14400', 5: '28680', 6: '29040'},}df = pd.DataFrame(data)print("原始DataFrame:")print(df)

接下来,我们应用pd.to_numeric并进行求和:

# 注意:选择列时应从索引为2的列开始,即跳过 'id' 和 'name' 列# 如果您的DataFrame结构不同,请相应调整列选择。df['total_hours'] = (    df.iloc[:, 2:] # 选择从第三列开始的所有列(日期列)      .apply(lambda x: pd.to_numeric(x, errors='coerce')) # 对每列应用pd.to_numeric      .sum(axis=1) # 对处理后的DataFrame按行求和)print("n添加 'total_hours' 列后的DataFrame:")print(df[['id', 'name', 'total_hours']])

代码解析:

df.iloc[:, 2:]:这部分代码用于选择DataFrame中从第三列(索引为2)开始的所有列。在我们的示例中,这包括了所有日期相关的工时记录列,排除了id和name列。.apply(lambda x: pd.to_numeric(x, errors=’coerce’)):对选定的每一列(x代表一个Series),应用一个lambda函数。这个函数的核心是pd.to_numeric(x, errors=’coerce’),它尝试将列中的每个元素转换为数值。如果转换失败,则替换为NaN。.sum(axis=1):对经过pd.to_numeric处理后生成的DataFrame(其中非数值已变为NaN)按行进行求和。Pandas的sum()函数默认会忽略NaN值,因此只有实际的数值会被加起来。

输出结果示例:

添加 'total_hours' 列后的DataFrame:     id       name  total_hours0   514     alexis          0.01  2414     donald     144660.02  3225  mackenzie     172020.03  3434     louisa     120720.04  3864       olga     100320.05  4716       rick     173700.06  5793    roberta     175560.0

现在,total_hours列正确地反映了每行中所有可转换数值的总和。

格式化总工时为时间间隔

由于求和结果是秒数,为了更直观地显示,我们可以将其转换为HH:MM或DD HH:MM:SS格式。Pandas提供了pd.to_timedelta函数,可以将秒数转换为时间间隔(timedelta)对象。

df['total_hours_formatted'] = pd.to_timedelta(df['total_hours'], unit='s')print("n格式化后的总工时:")print(df[['id', 'name', 'total_hours_formatted']])

输出结果示例:

格式化后的总工时:     id       name total_hours_formatted0   514     alexis       0 days 00:00:001  2414     donald       1 days 16:11:002  3225  mackenzie       1 days 23:47:003  3434     louisa       1 days 09:32:004  3864       olga       1 days 03:52:005  4716       rick       2 days 00:15:006  5793    roberta       2 days 00:46:00

这样,总工时就被转换成了更易读的时间格式。

注意事项与总结

列选择的准确性: 在应用apply和sum之前,务必确保您选择的是包含数值数据(即使是以字符串形式存在)的正确列。错误地包含了id或name等非日期/时间列,可能会导致额外的错误或不准确的结果。使用iloc进行基于位置的选择,或使用列名列表进行基于标签的选择都是有效的方法。errors=’coerce’的重要性: 如果不使用errors=’coerce’,pd.to_numeric在遇到非数字字符串时会抛出错误,中断程序执行。’coerce’参数是处理脏数据、确保代码健壮性的关键。NaN值的处理: sum()函数默认会忽略NaN值。如果您的业务逻辑要求将NaN视为0参与求和,可以在sum()之前使用fillna(0)。数据类型一致性: 尽管本教程提供了处理混合数据类型的方案,但最佳实践是在数据导入或生成时就尽量保证数据类型的一致性。将数字存储为字符串会增加处理的复杂性。

通过以上方法,您可以有效地在Pandas DataFrame中对包含混合数据类型的行进行求和,避免因numeric_only参数误解而导致的0值结果,并灵活地格式化您的输出。

以上就是Pandas DataFrame行求和技巧:处理混合数据类型并避免0值结果的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Discord.py 应用命令:深入理解 Interaction 对象的使用
上一篇 2025年12月14日 23:22:28
如何在Python中使用Pandas和NumPy处理多条件数据筛选与聚合
下一篇 2025年12月14日 23:22:43

相关推荐

  • Excel模拟运算表怎么用_Excel模拟运算表如何进行假设分析评估风险

    使用模拟运算表可分析变量对结果的影响。先创建单变量表:设公式=A21.1,在列输入变量值,引用公式后选区域,数据→模拟分析→模拟运算表,指定输入单元格为A2,得结果;再建双变量表:公式=A2B1,行列分别输入两变量值,引用公式后选区域,设置行引用B1、列引用A2,生成组合结果;确保公式引用独立参数单…

    2026年9月5日
    000
  • win10操作中心打不开怎么办_win10操作中心无法打开的解决方法

    首先检查组策略设置是否禁用操作中心,通过gpedit.msc将其设为已禁用或未配置;若无效,使用管理员权限PowerShell重新注册系统应用包并修复系统文件,执行sfc /scannow和DISM命令修复系统映像,最后重启资源管理器进程或计算机恢复功能。 如果您尝试点击任务栏右下角的图标或使用快捷…

    2026年9月5日
    000
  • win8怎么关闭屏幕键盘_Win8屏幕键盘关闭方法

    win8怎么关闭屏幕键盘_Win8屏幕键盘关闭方法win8怎么关闭屏幕键盘_Win8屏幕键盘关闭方法win8怎么关闭屏幕键盘_Win8屏幕键盘关闭方法win8怎么关闭屏幕键盘_Win8屏幕键盘关闭方法

    1、通过任务栏工具栏取消勾选“触摸键盘”可关闭;2、使用Win+R输入osk后关闭弹出窗口;3、在轻松访问中心关闭“使用屏幕键盘”选项;4、禁用“Touch Screen Keyboard and Handwriting Panel Service”服务防止自动启动。 如果您在使用Windows 8…

    2026年9月5日 用户投稿
    000
  • win10怎么开启存储感知自动清理空间_win10存储感知功能配置教程

    首先开启存储感知功能以自动清理磁盘空间,通过设置进入系统存储选项并打开存储感知开关;随后配置清理频率与规则,自定义运行周期及临时文件、回收站等清理条件;最后可手动点击“立即运行”触发即时清理,释放磁盘空间。 如果您发现Windows 10系统的磁盘空间逐渐减少,可能是由于临时文件、缓存或回收站内容未…

    2026年9月5日
    000
  • laravel如何实现基于角色的权限管理_Laravel角色权限管理实现教程

    使用Spatie Laravel-Permission包可快速实现RBAC。先通过composer安装并发布迁移文件,执行数据库更新;在User模型中引入HasRoles trait;创建角色与权限并通过givePermissionTo方法关联;为用户分配角色或直接授权;利用middleware(&…

    2026年9月5日
    100
  • win10怎么彻底删除旧的windows.old文件夹_Win10安全删除Windows.old文件夹教程

    首先使用磁盘清理工具删除Windows.old文件夹以释放C盘空间,具体步骤为:打开C盘属性,点击磁盘清理,勾选“以前的Windows安装”并确认删除;其次可通过存储感知功能,在设置中进入存储管理,手动删除“以前版本的Windows”;最后可使用管理员权限运行命令提示符,执行rd /s /q C:w…

    2026年9月5日
    000
  • vs2010怎么在页面使用控件

    在vs2010中利用控件进行页面设计是一项关键的开发能力。下面将逐步讲解如何在网页中使用控件完成界面构建。 向页面添加控件 启动vs2010后,首先创建一个新项目,选择合适的项目模板,例如ASP.NET Web应用程序。接着,在解决方案资源管理器中定位到目标页面文件(通常为.aspx格式),双击该文…

    2026年9月5日
    000
  • win10怎么更改用户名_win10修改本地账户用户名的教程

    可通过设置应用修改Microsoft账户姓名以更新显示名称;2. 使用控制面板或计算机管理工具可更改本地账户名,但不影响用户文件夹名称;3. 命令提示符执行wmic命令亦可重命名账户。 如果您在使用Windows 10时希望更改本地账户的用户名,但不确定如何操作,可能会遇到显示名称与账户文件夹名称的…

    2026年9月5日
    000
  • 铁路12306电子发票申请提示信息有误怎么办_铁路12306电子发票提示信息处理方法

    首先检查发票抬头信息是否准确,进入铁路12306 App“我的”-“电子发票”-“发票抬头管理”修改企业名称或税号;其次确认乘车人身份信息与账户一致,核对“本人车票”订单中的姓名和证件号;最后重新申请开具,系统将作废原发票并在180天内生成新发票。 如果您在申请铁路12306电子发票时,系统提示信息…

    2026年9月5日
    000
  • 笔记本电脑性能模式设置_电源计划调整方法

    调整笔记本电脑性能模式的核心是设置电源计划,可通过windows搜索栏输入“电源计划”快速找到设置入口;2. 默认电源计划包括“平衡”模式(动态调节性能与续航)、“节能”模式(降低性能延长续航)和“高性能”模式(全力输出性能,耗电高);3. 可通过“更改高级电源设置”自定义处理器状态、硬盘关闭时间等…

    2026年9月5日
    100
  • win10怎么查看ip地址_win10电脑IP地址的查询方法

    1、通过“设置”应用可图形化查看IP地址;2、命令提示符输入ipconfig获取IPv4地址;3、网络和共享中心提供详细网络信息包括IP;4、PowerShell执行命令精准筛选IPv4地址。 如果您需要了解自己计算机在网络中的唯一标识,以便进行网络故障排查或配置共享服务,则必须获取本机的IP地址。…

    2026年9月5日
    000
  • win11怎么校准屏幕颜色_Win11显示器色彩校准工具使用方法

    首先使用Windows内置工具校准显示器颜色,依次调整伽马、亮度、对比度和色彩平衡,并创建新配置文件;接着通过ClearType文本调谐器优化字体清晰度,选择最舒适的文本样本;对于HDR内置屏幕,在设置中启用HDR并校准明暗细节;外接HDR显示器则需下载“Windows HDR Calibratio…

    2026年9月5日
    100
  • mysql中如何分析锁等待情况

    通过INFORMATION_SCHEMA.INNODB_LOCK_WAITS和INNODB_TRX表可定位阻塞事务,MySQL 8.0后推荐使用performance_schema.data_lock_waits分析锁等待关系,结合SHOW ENGINE INNODB STATUS查看死锁及事务状态…

    2026年9月5日
    100
  • 如何在Linux中强制终止进程?

    强制终止进程常用kill、killall和pkill命令发送信号;先用ps或pgrep获取PID,再执行kill -9 PID终止指定进程;killall -9 进程名可结束所有同名进程;pkill -9 支持按名称、用户等条件终止进程;-9为SIGKILL信号,强制终止且不可忽略,但应优先尝试默认…

    2026年9月5日
    100
  • win11怎么修复文件资源管理器无响应_win11文件资源管理器卡顿解决方法

    首先重启Windows资源管理器进程,若无效则运行SFC扫描修复系统文件,接着清理磁盘临时文件,排除第三方Shell扩展干扰,最后通过创建新用户配置文件判断是否配置损坏,逐步解决资源管理器卡顿问题。 如果您尝试打开或使用文件资源管理器时出现无响应或卡顿现象,这可能是由于系统进程冲突、缓存异常或外壳程…

    2026年9月5日
    100
  • medibang paint透视笔的位置在哪里

    在medibang paint这款绘画软件中,透视笔是一项极为实用的功能,能够有效辅助画师构建准确的透视结构,让画面更具空间感与真实感。那么,这个功能强大的工具究竟藏在哪里呢? 首先,启动MediBang Paint并进入绘图界面后,我们应将目光投向软件左侧默认显示的工具栏。 如果发现工具栏未完整呈…

    2026年9月5日
    100
  • win10任务栏没反应了怎么办_win10任务栏卡死无响应解决方法

    1、重启Windows资源管理器可解决卡顿问题,通过任务管理器重新启动explorer.exe进程;2、使用PowerShell重新注册系统应用修复组件异常;3、禁用“资讯和兴趣”功能避免后台冲突;4、运行DISM和SFC命令修复系统文件损坏;5、创建新用户账户判断是否因配置文件损坏导致问题。 如果…

    2026年9月5日
    2100
  • UC网盘如何查看最近使用文件_UC网盘最近文件访问

    UC网盘可通过“最近使用”功能快速查找近期操作文件,该列表按时间倒序展示;若无此入口,可进入“全部文件”后点击“时间”排序并选择倒序;还可结合搜索框输入关键词后按“今天”“近7天”等时间范围筛选,精准定位目标文件。 如果您在使用UC网盘时需要查找最近访问或操作过的文件,可以直接通过其“最近使用”功能…

    2026年9月5日
    100
  • 电脑麦克风没声音_电脑麦克风无法使用怎么解决

    1.先检查物理连接是否牢固,确保麦克风正确插入对应接口;2.查看系统音量设置,确认麦克风未被禁用且设为默认设备;3.检查windows隐私权限,确保系统和应用有麦克风访问权;4.排查应用内音频设置,选择正确的输入设备并调整输入音量;5.通过设备管理器检查驱动状态,更新、手动安装或卸载重装驱动;6.若…

    2026年9月5日
    100
  • 谷歌翻译退出大陆后,还有什么好用的页面翻译插件?

    谷歌翻译撤出中国大陆后,有哪些优秀的网页翻译插件替代品? 谷歌翻译停止服务后,许多开发者和用户面临页面翻译工具缺失的困境,尤其依赖其IDE翻译插件的群体受到较大影响。因此,寻找一款功能强大的替代品至关重要。 SegmentFault 推出的 hcfy 插件是一个不错的选择,它兼容 Chrome、Fi…

    2026年9月5日
    100

发表回复

登录后才能评论
关注微信