You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Pandas DataFrame某列单元格内的数值求和?

解决Pandas DataFrame单元格内数值求和问题

我懂你遇到的困扰——想把occ列每个单元格里的数字提取出来求和,之前参考方法还报了"string index out of range"错误对吧?下面给你一套靠谱的解决方案,先理清楚你的场景:

原始数据与期望目标

首先是你创建DataFrame的代码:

import pandas as pd

data = [['ID_123456', 'example=1(abc)'], ['ID_123457', 'example=1(def)'], ['ID_123458', 'example=1(try)'], ['ID_123459', 'example=1(test)'], ['ID_123460', 'example=1(try),2(test)'], ['ID_123461', 'example=1(try),2(test),9(yum)'], ['ID_123462', 'example=1(test)'], ['ID_123463', 'example=1(try),7(test)']]
df = pd.DataFrame(data, columns = ['ID', 'occ'])

原始数据样例:

IDocc
ID_123456example=1(abc)
ID_123457example=1(def)
ID_123458example=1(try)
ID_123459example=1(test)
ID_123460example=1(try),2(test)
ID_123461example=1(try),2(test),9(yum)
ID_123462example=1(test)
ID_123463example=1(try),7(test)

你希望新增count列,得到每个单元格内数字的求和结果,比如example=1(try),2(test)对应count=3,example=1(try),2(test),9(yum)对应count=12。

问题原因分析

之前报错"string index out of range",大概率是因为用了固定位置的字符串索引提取数字,但不同单元格的字符串长度、格式有差异,导致索引越界。我们需要用更灵活的方法——正则表达式来提取所有数字。

解决方案代码

用正则提取所有数字后分组求和,完美适配你的场景:

# 提取每个单元格内的所有整数,转为数值类型
nums = df['occ'].str.extractall(r'(\d+)')[0].astype(int)

# 按原DataFrame的行索引分组求和,合并回原表
df['count'] = nums.groupby(level=0).sum()

# 查看最终结果
print(df)

运行后就能得到你想要的输出:

IDocccount
ID_123456example=1(abc)1
ID_123457example=1(def)1
ID_123458example=1(try)1
ID_123459example=1(test)1
ID_123460example=1(try),2(test)3
ID_123461example=1(try),2(test),9(yum)12
ID_123462example=1(test)1
ID_123463example=1(try),7(test)8

代码逻辑解释

  • str.extractall(r'(\d+)'):用正则\d+匹配所有连续数字,extractall会把每个单元格里的所有数字都提取出来,生成带多层索引的Series(第一层是原表行索引,第二层是单元格内数字的序号)
  • astype(int):把提取到的字符串数字转为整数,方便后续求和
  • groupby(level=0).sum():按原表行索引分组,对每组的数字求和,得到每行对应的总数值
  • 最后把求和结果赋值给新列count,完成需求

这个方法不依赖字符串的固定位置,不管单元格里有多少个数字、数字位数如何,都能准确提取求和,不会出现索引越界的问题。

内容的提问来源于stack exchange,提问作者soosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:59:06