如何对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'])
原始数据样例:
| ID | occ |
|---|---|
| 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) |
你希望新增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)
运行后就能得到你想要的输出:
| ID | occ | count |
|---|---|---|
| ID_123456 | example=1(abc) | 1 |
| ID_123457 | example=1(def) | 1 |
| ID_123458 | example=1(try) | 1 |
| ID_123459 | example=1(test) | 1 |
| ID_123460 | example=1(try),2(test) | 3 |
| ID_123461 | example=1(try),2(test),9(yum) | 12 |
| ID_123462 | example=1(test) | 1 |
| ID_123463 | example=1(try),7(test) | 8 |
代码逻辑解释
str.extractall(r'(\d+)'):用正则\d+匹配所有连续数字,extractall会把每个单元格里的所有数字都提取出来,生成带多层索引的Series(第一层是原表行索引,第二层是单元格内数字的序号)astype(int):把提取到的字符串数字转为整数,方便后续求和groupby(level=0).sum():按原表行索引分组,对每组的数字求和,得到每行对应的总数值- 最后把求和结果赋值给新列
count,完成需求
这个方法不依赖字符串的固定位置,不管单元格里有多少个数字、数字位数如何,都能准确提取求和,不会出现索引越界的问题。
内容的提问来源于stack exchange,提问作者soosa
相关产品推荐
相关产品推荐

