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

Pandas处理分块DataFrame时Sum()返回多值而非求和结果的问题

问题:Dog块中Wolf品种的Age求和返回多个值

我正在提取一个内含多个数据帧的文本文件,已编写代码定义各数据块的起始(Start)和结束(End)索引列表。遍历各数据块时,针对标记为Dog的块,筛选breed为Wolf的行并对Age列求和,但sum()未返回单一求和值,而是输出多个值。已确认值为浮点型,具备求和条件,需解决该问题。

复现代码

import pandas as pd
data = {'Begin': ['START', '', '', 'START', '', '', 'START', '', '','', 'START', '', ''],
'Type': ['Dog', '', 'END', 'Cat', '', 'END', 'Dog', '', '','END', 'Cat', '', 'END'],
    'breed': ['', 'Wolf', 'bork', '','Wolf', '', '','Wolf','bork','', '','Wolf','bork'],
    'Age': [20, 21, 19, 18,20, 21, 19,15,16,0, 19,15,16]
   }

data = pd.DataFrame(data)
Start = (data['Type'].index[data['Begin']=='START']).astype(int)

End = (data['Type'].index[data['Type']=='END']).astype(int)

for index, value in enumerate(Start):
    Frip = data.iloc[int(value) : End[int(f'{index}')]]
    if Frip.loc[value].str.contains('Dog').any() == True:
        TESTING = pd.to_numeric(Frip.query('breed == "Wolf"').Age)
        TESTING = sum(TESTING)
        print(TESTING)

问题根源

  • 块判断逻辑错误:Frip.loc[value].str.contains('Dog').any()会遍历START行的所有列,只要任意列包含"Dog"就触发求和,这种模糊匹配容易导致同一Dog块被多次触发处理。
  • 切片范围不当:data.iloc[int(value) : End[int(f'{index}')]]包含了START行本身,结合错误的判断逻辑,会让求和操作被重复执行。
  • 求和方式不严谨:使用Python内置sum()处理pandas Series,虽然结果可能正确,但不如Series自带的sum()方法稳定,易在多元素场景下出现混淆。

修正代码

import pandas as pd
data = {'Begin': ['START', '', '', 'START', '', '', 'START', '', '','', 'START', '', ''],
'Type': ['Dog', '', 'END', 'Cat', '', 'END', 'Dog', '', '','END', 'Cat', '', 'END'],
    'breed': ['', 'Wolf', 'bork', '','Wolf', '', '','Wolf','bork','', '','Wolf','bork'],
    'Age': [20, 21, 19, 18,20, 21, 19,15,16,0, 19,15,16]
   }

data = pd.DataFrame(data)
# 直接获取START和END的索引,无需额外转int
Start = data[data['Begin'] == 'START'].index
End = data[data['Type'] == 'END'].index

for idx, start_idx in enumerate(Start):
    end_idx = End[idx]
    # 跳过START行,只取块内有效业务数据
    block_data = data.iloc[start_idx + 1 : end_idx]
    # 通过START行的Type值精准判断是否为Dog块
    if data.loc[start_idx, 'Type'] == 'Dog':
        # 筛选Wolf品种的行
        wolf_records = block_data[block_data['breed'] == 'Wolf']
        # 转换为数值并使用Series内置求和方法
        total_age = pd.to_numeric(wolf_records['Age']).sum()
        print(total_age)

核心修改说明

  • 精准判断块类型:直接读取START行的Type值判断是否为Dog块,避免模糊匹配导致的误触发。
  • 切片优化:从start_idx + 1开始切片,跳过START行,只处理块内的业务数据。
  • 规范求和方式:使用pandas Series的sum()方法求和,结果更稳定且符合pandas的使用习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:44:59