解决Pandas DataFrame行求和为0的常见问题:混合数据类型处理指南

解决pandas dataframe行求和为0的常见问题:混合数据类型处理指南

在Pandas DataFrame中对包含混合数据类型的行进行求和时,直接使用`df.sum(axis=1, numeric_only=True)`可能因列中存在非纯数值类型而返回0。本文将详细介绍如何通过`pd.to_numeric(errors=’coerce’)`将非数值条目转换为`NaN`,然后进行精确求和,并进一步展示如何将总秒数格式化为更易读的时间间隔。

理解numeric_only参数的局限性

当我们在Pandas DataFrame中尝试对行进行求和,并期望只计算数值列时,一个常见的做法是使用df.sum(axis=1, numeric_only=True)。然而,如果DataFrame中的某些列虽然包含看起来像数字的字符串(例如’29160’),但也混杂了其他非数值字符串(例如’No hours logged’)甚至列表(例如[10:02, Odd number: missing entry]),那么numeric_only=True参数的行为可能与预期不符。

根据Pandas的官方文档,numeric_only=True的含义是“仅包含浮点、整数、布尔列”。这意味着,如果一整列中哪怕只有一个非数值类型的值(例如字符串),Pandas就会将该列视为非数值列,从而在求和时完全排除该列。在本例中,所有日期列都包含至少一个字符串值(如’No hours logged’),因此它们都被numeric_only=True排除,导致最终的total_hours列全部为0.0。

正确处理混合数据类型并进行行求和

要解决这个问题,我们需要在求和之前,显式地将目标列中的非数值条目转换为可计算的数值类型。

步骤1:数据预处理——将非数值转换为NaN

Pandas提供了pd.to_numeric()函数,它能够尝试将Series或DataFrame中的值转换为数值类型。结合errors=’coerce’参数,我们可以优雅地处理转换失败的情况:任何无法转换为数字的值都将被替换为NaN(Not a Number)。

import pandas as pd# 示例数据准备 (与原文提供的数据一致)data = {    '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)# 假设daily_logs列已经展开,如果未展开,需要先执行类似 df = pd.concat([df,pd.DataFrame(list(df['daily_logs']))],axis=1).drop(columns='daily_logs') 的操作# 在本示例中,我们直接使用已展开的df# 选择需要求和的列(从索引为2的列开始,即跳过'id'和'name')# 对这些列应用pd.to_numeric,并将无法转换的值设为NaN# 然后对转换后的结果进行行求和df['total_hours'] = (    df.iloc[:, 2:]      .apply(lambda x: pd.to_numeric(x, errors='coerce'))      .sum(axis=1))print(df[['id', 'name', 'total_hours']])

输出结果:

     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列正确地显示了每行中所有可转换数值的总和。sum()函数在默认情况下会忽略NaN值,这正是我们想要的行为。

关键点:

df.iloc[:, 2:]: 确保只选择包含工作时间数据的列。iloc是基于整数位置的索引,[:, 2:]表示选择所有行,并从第3列(索引为2)开始到最后一列。请根据实际DataFrame的结构调整起始列索引。.apply(lambda x: pd.to_numeric(x, errors=’coerce’)): 这会遍历选定DataFrame中的每一列(x代表一个Series),并对该列应用pd.to_numeric函数。errors=’coerce’是这里的关键,它将所有无法解析为数字的条目(如’No hours logged’或'[10:02, Odd number: missing entry]’)转换为NaN。.sum(axis=1): 在所有相关列都被成功转换为数值类型(或NaN)之后,对这些列进行行方向(axis=1)的求和。

优化时间格式显示

原始数据中的工作时间以秒为单位记录。为了提高可读性,我们可以将总秒数转换为更友好的时间格式,例如HH:MM:SS。Pandas的pd.to_timedelta()函数非常适合这个任务。

# 将总秒数转换为timedelta对象df['total_duration'] = pd.to_timedelta(df['total_hours'], unit='s')print(df[['id', 'name', 'total_hours', 'total_duration']])

输出结果:

     id       name  total_hours total_duration0   514     alexis          0.0 0 days 00:00:001  2414     donald     144660.0 1 days 16:11:002  3225  mackenzie     172020.0 1 days 23:47:003  3434     louisa     120720.0 1 days 09:32:004  3864       olga     100320.0 1 days 03:52:005  4716       rick     173700.0 2 days 00:15:006  5793    roberta     175560.0 2 days 00:46:00

total_duration列现在以timedelta64[ns]类型存储,并以天、小时、分钟和秒的格式显示,极大地提升了数据的可读性。

完整的解决方案函数

将上述步骤封装到一个函数中,可以方便地应用于任何类似的DataFrame:

def calculate_total_working_hours(df_input):    """    计算DataFrame中每行的总工作时间(秒),并添加一个格式化的时间持续时间列。    参数:    df_input (pd.DataFrame): 包含工作时间数据的DataFrame。                             假设工作时间数据从第三列(索引2)开始。    返回:    pd.DataFrame: 包含 'total_hours' (总秒数) 和 'total_duration' (时间持续时间) 列的DataFrame。    """    df = df_input.copy() # 避免修改原始DataFrame    # 1. 选择需要求和的列并转换为数值,将非数值强制转换为NaN    # 注意:这里假设 'id' 和 'name' 是前两列,实际使用时请根据DataFrame结构调整列索引    df['total_hours'] = (        df.iloc[:, 2:]          .apply(lambda x: pd.to_numeric(x, errors='coerce'))          .sum(axis=1)    )    # 2. 将总秒数转换为timedelta格式    df['total_duration'] = pd.to_timedelta(df['total_hours'], unit='s')    return df# 使用示例df_results = calculate_total_working_hours(df.copy()) # 传入原始df的副本print(df_results[['id', 'name', 'total_hours', 'total_duration']])

注意事项

列索引的准确性: 在使用df.iloc[:, 2:]时,请务必确认2是您希望开始求和的列的正确索引。如果您的DataFrame结构不同,例如有更多的非数值前置列,您需要调整这个索引。errors=’coerce’的副作用: errors=’coerce’会将所有无法转换为数值的值替换为NaN。这意味着,如果您的数据中存在其他有意义的非数值字符串(例如,表示特殊状态的文本,而非简单的“未记录”),并且您希望保留这些信息或以不同方式处理它们,那么这种方法可能需要进一步细化。但对于本例中的“No hours logged”和格式错误的列表,这是一种非常有效的处理方式。数据类型一致性: 理想情况下,数据在加载到DataFrame之前就应该进行清理,确保数值列只包含数值。但在面对真实世界中的混合数据时,上述方法提供了强大的弹性。

总结

在Pandas中对DataFrame行进行求和时,如果遇到因混合数据类型导致numeric_only=True失效并返回0的情况,核心解决方案是:

精确选择需要求和的列。使用pd.to_numeric(errors=’coerce’)将这些列中的非数值条目统一转换为NaN。然后对转换后的结果执行sum(axis=1),Pandas会自动忽略NaN值。对于时间数据,可以进一步利用pd.to_timedelta()进行格式化,提升数据可读性。

掌握这些技巧,将使您在处理真实世界中复杂且不一致的数据时,能够更高效、更准确地进行数据分析和计算。

以上就是解决Pandas DataFrame行求和为0的常见问题:混合数据类型处理指南的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
解决cuDF与Numba集成中的NVVM缺失问题:CUDA开发环境配置指南
上一篇 2025年12月14日 22:42:48
Python实现文本文件行号自动递增写入教程
下一篇 2025年12月14日 22:43:04

相关推荐

  • sublime怎么比较两个文件的差异_Sublime Text文件内容对比插件使用方法

    sublime怎么比较两个文件的差异_Sublime Text文件内容对比插件使用方法sublime怎么比较两个文件的差异_Sublime Text文件内容对比插件使用方法sublime怎么比较两个文件的差异_Sublime Text文件内容对比插件使用方法sublime怎么比较两个文件的差异_Sublime Text文件内容对比插件使用方法

    安装Compare Side-By-Side插件可实现文件对比,打开两个文件后右键选择“Compare Files”即可高亮显示差异,支持并排查看与同步滚动,提升代码比对效率。 Sublime Text 本身不带文件对比功能,但通过安装插件可以轻松实现两个文件的差异比较。最常用的是 Diff 和 A…

    2026年9月28日 • 用户投稿
    000
  • 并发编程中Future对象使用不当及解决方案

    并发编程中Future对象使用不当及解决方案并发编程中Future对象使用不当及解决方案并发编程中Future对象使用不当及解决方案并发编程中Future对象使用不当及解决方案

    本文针对Java并发编程中常见的set<int, Future> is not applicable to arguments (int,int)错误,深入剖析了其产生的原因,即试图将整型值直接赋值给存储Future对象的集合。文章将详细阐述Future对象的特性,并提供正确的解决方案,…

    2026年9月28日 • 用户投稿
    000
  • 苹果用户DeepSeek轻松上手操作指南

    苹果用户DeepSeek轻松上手操作指南苹果用户DeepSeek轻松上手操作指南苹果用户DeepSeek轻松上手操作指南苹果用户DeepSeek轻松上手操作指南

    苹果用户可在官网下载deepseek并手动信任安装;登录推荐用微信或邮箱;功能使用需根据需求切换模式和设置。具体步骤为:1. 访问官网下载对应ios/mac版本,前往设备管理中信任开发者证书;2. 登录时选择微信扫码或邮箱注册,团队用户可选企业账号;3. 使用前调整设置,如切换模型模式、开启历史记录…

    2026年9月28日 • 用户投稿
    100
  • 飞书桌面端闪退问题 飞书程序错误修复办法

    飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法飞书桌面端闪退问题 飞书程序错误修复办法

    飞书桌面端闪退多由兼容性、缓存或系统冲突引起,可依次尝试:设置兼容模式运行、更新或重装最新版飞书、回退系统更新;清除AppData路径下的缓存文件;以管理员身份运行sfc和DISM命令修复系统文件;关闭安全软件测试并添加飞书白名单;检查隐私权限设置。按顺序排查基本可解决。 飞书桌面端闪退确实挺烦人,…

    2026年9月27日 • 用户投稿
    000
  • 夸克会员有什么用_夸克会员权益与功能详解

    夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解夸克会员有什么用_夸克会员权益与功能详解

    夸克SVIP会员提供6TB云存储、下载速率高达50MB/s、多格式在线预览、智能剪贴板捕获、自动备份手机相册与聊天记录、回收站保留60天及批量文件管理功能,全面提升使用体验。 如果您在使用夸克时发现部分文件下载缓慢、存储空间不足或无法访问某些高级功能,这可能是因为您尚未开通会员服务。以下是关于夸克会…

    2026年9月27日 • 用户投稿
    100
  • 在抖音的小程序中,如何取消订单?简单操作指南

    在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南在抖音的小程序中,如何取消订单?简单操作指南

    抖音小程序为用户带来了流畅的购物体验,但有时因各种原因您可能需要取消已下单的商品。本文将为您详细介绍如何快速、顺利地完成订单取消流程。 登录抖音小程序 请先打开抖音APP,进入对应的小程序页面,并确保已使用您的账号成功登录,以便查看个人订单信息。 查找目标订单 进入“我的订单”页面: 在小程序首页,…

    2026年9月27日 • 用户投稿
    000
  • DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议

    DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议DeepSeek 与 ChatGPT 有什么区别 特性对比与选型建议

    deepseek和chatgpt的主要区别在于训练数据、模型架构、擅长领域及应用场景。1. deepseek侧重代码生成与数学推理,适合编程及逻辑任务;2. chatgpt擅长自然语言处理与文本生成,适用于对话、写作等场景;3. 选型应根据项目核心需求决定,若重代码理解选deepseek,若重语言表…

    2026年9月27日 • 用户投稿
    000
  • sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置

    sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置sublime怎么记住上一次打开的文件_Sublime记忆上次会话与文件设置

    Sublime Text 能自动恢复上次打开的文件和布局,需确保设置正确。首先在 Preferences → Settings 用户配置中添加 “remember_open_files”: true 和 “hot_exit”: false,前者保证恢复…

    2026年9月27日 • 用户投稿
    000
  • 从一副牌中抽取唯一牌的正确方法(Java)

    从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)从一副牌中抽取唯一牌的正确方法(Java)

    本文旨在解决在Java中使用递归函数从一副牌中抽取唯一牌时出现的java.lang.StackOverflowError问题。通过分析错误原因,提供正确的代码示例,并详细解释了如何避免该错误,确保每次抽取的牌都是唯一的。本文将帮助读者理解递归的正确使用方式以及如何优化代码以提高效率。 问题分析 原始…

    2026年9月27日 • 用户投稿
    000
  • Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径

    Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径Safari浏览器下载的文件在哪里找_Safari浏览器下载文件存储位置查找路径

    首先通过“文件”App的iCloud云盘中“下载”文件夹查找Safari下载内容,其次可在Safari浏览器内点击页面设置按钮查看下载记录,最后进入设置App修改Safari默认下载位置以实现灵活管理。 如果您在使用Safari浏览器下载文件后无法找到其存储位置,可能是由于系统默认将文件保存至特定目…

    2026年9月27日 • 用户投稿
    100
  • 规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!

    规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!规划指南vs随性秘籍:右滑直达华为负一屏搞定你的国庆假期!

    国庆长假即将到来,最近南方的小伙伴们肯定还无心假期,都在忐忑等待全球最强台风“桦加沙”的到来。目前广东多地都因台风过境而宣布实时“五停”,大家台风天气记得做好防护,不出门不上路,保障人身安全。为了便于让广大居民在家了解台风情况,华为手机负一屏已上线台风动态卡片功能,用户桌面右滑可以快速查看台风等级、…

    2026年9月27日 • 用户投稿
    100
  • 如何免费查询抖音店铺名字大全?推荐技巧

    如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧如何免费查询抖音店铺名字大全?推荐技巧

    想要免费获取抖音店铺名字灵感并掌握高效查询技巧,不妨参考以下实用方法: 1. 善用抖音内置搜索 抖音平台本身就是一个巨大的命名灵感库。只需几步即可挖掘热门名称: 打开抖音App,点击顶部搜索栏。输入行业关键词,如“女装店”、“奶茶店”、“手作饰品”等。浏览搜索结果中的账号昵称与店铺名,筛选出风格契合…

    2026年9月27日 • 用户投稿
    100
  • sublime怎么安装less或sass的编译插件_Sublime Less及Sass自动编译插件安装配置

    sublime怎么安装less或sass的编译插件_Sublime Less及Sass自动编译插件安装配置sublime怎么安装less或sass的编译插件_Sublime Less及Sass自动编译插件安装配置sublime怎么安装less或sass的编译插件_Sublime Less及Sass自动编译插件安装配置sublime怎么安装less或sass的编译插件_Sublime Less及Sass自动编译插件安装配置

    Sublime Text中Less/Sass编译插件的核心优势在于实现自动编译,提升开发效率。通过Package Control安装如Less2Css或SassBuild等插件,可在保存文件时自动将Less或Sass代码转换为CSS,无需手动执行命令行编译。其主要优势包括:即时反馈,修改后保存即生成…

    2026年9月27日 • 用户投稿
    000
  • edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法

    edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法edge提示“由你的组织管理”怎么解除_edge解除“由你的组织管理”提示的方法

    首先删除注册表中HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下的Edge策略项,再通过gpedit.msc禁用组策略设置,接着重置Edge浏览器,排查卸载第三方管理软件,最后手动清除Local State文件中的管理配置。 如果您在使用 Microsoft Edge 浏览…

    2026年9月27日 • 用户投稿
    000
  • VSCode如何优化文件搜索速度 VSCode全局搜索的性能优化建议

    vscode文件搜索慢的核心原因是未合理排除无关文件及系统环境限制,解决方法是一套组合拳:1. 配置search.exclude在settings.json中排除node_modules、dist等无关文件夹;2. 确保使用.gitignore并开启search.useignorefiles;3. …

    2026年9月27日
    000
  • 【Linux/C++】Linux下C++命令行编译示例

    本文是关于c++++编程语言基础和linux系统操作基础的系列文章的第二部分。我们将详细介绍在linux环境下如何编译c++代码,并展示相关的编译示例和技巧。 文章目录 准备源代码编译实战引入目录进行编译使用-Wall、-std 参数进行编译生成库文件链接静态库生成可执行文件链接动态库生成可执行文件…

    2026年9月27日
    100
  • Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南

    Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南Gemini移动端如何节省流量 Gemini数据压缩与缓存设置指南

    gemini移动端节省流量的核心方法包括:1.开启应用内的数据压缩模式,选择低分辨率加载图片和视频;2.关闭自动播放功能,防止后台流量浪费;3.限制或关闭后台刷新与预加载,减少无谓的数据更新;4.定期清理缓存或设置缓存上限,避免过期数据重复下载;5.启用系统级低数据模式,限制后台流量使用;6.关闭g…

    2026年9月27日 • 用户投稿
    100
  • 星巴克点单抖音怎么弄的?快速了解方法与实用技巧

    星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧星巴克点单抖音怎么弄的?快速了解方法与实用技巧

    引言: 在移动互联网高速发展的今天,抖音已成为大众记录生活、分享日常的重要社交平台。不少用户开始关注:是否可以直接在抖音上点星巴克咖啡?答案是肯定的!本文将为您详细介绍如何通过抖音轻松完成星巴克点单,并提供实用操作技巧与相关知识,助您畅享便捷又有趣的消费体验。 一、星巴克为何选择抖音点单?背后趋势解…

    2026年9月27日 • 用户投稿
    000
  • 如何通过地址空间随机化增强安全防护?

    如何通过地址空间随机化增强安全防护?如何通过地址空间随机化增强安全防护?如何通过地址空间随机化增强安全防护?如何通过地址空间随机化增强安全防护?

    ASLR通过随机化内存布局,使攻击者难以预测关键区域地址,显著增加内存攻击难度。 通过地址空间随机化(ASLR),我们能显著提升系统面对内存攻击时的防御能力。核心思想很简单:让攻击者无法预知关键内存区域(比如堆、栈、共享库)的精确位置,从而大幅增加利用漏洞的难度和不确定性。这就像在一片黑暗中寻找一个…

    2026年9月27日 • 用户投稿
    100
  • 设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体

    设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体设置Apache FOP字体相对路径:使用fop.xconf配置跨平台字体

    Apache FOP在不同操作系统下配置字体时,使用绝对路径会遇到兼容性问题。本文详细介绍如何在fop.xconf中利用标签和相对embed-url属性,灵活指定字体文件的相对路径,确保应用程序在多种环境中都能正确加载和渲染字体,避免硬编码路径,提升可移植性。 FOP字体配置的跨平台挑战 在使用ap…

    2026年9月27日 • 用户投稿
    500

发表回复

登录后才能评论
关注微信