pandas 3.0.1 空表求和报 could not convert string to float
筛选后没有数据,sum 却因空字符串转浮点失败。区分 pandas 3.0.1 的混合类型回归与真正的脏数值,按统计口径选择升级或只聚合数值列。
筛选结果一行也没有,调用 DataFrame.sum() 却报 ValueError: could not convert string to float: ''。如果表里同时保留字符串列和数值列,且环境是 pandas 3.0.1、启用了 Arrow 字符串存储,应先检查空表聚合的回归,不必马上去原始 CSV 里寻找空字符串数字。
pandas 3.0.2 已包含这项修复。这个版本结论针对空的混合类型 DataFrame,不代表任意字符串列都能参与数值求和。
没有行,仍然有列和 dtype
下面是触发形状,数据仅用于说明:
import pandas as pd
df = pd.DataFrame({"label": ["x", "y"], "amount": [1, 2]})
selected = df.loc[df["amount"] > 10]
print(selected.shape)
print(selected.dtypes)
result = selected.sum()
selected 的行数为零,字符串列与整数列却仍存在。受影响路径中,Arrow 字符串列的空和得到空字符串,数值列的空和得到零,合并结果时又尝试统一转换成浮点,最终在空字符串处失败。
因此,要保留报错前的 shape、各列 dtype 和实际 pandas 版本。若表并不为空,或错误直接来自 astype(float)、to_numeric(),应按真实转换入口排查,不能仅因消息相同就认定属于这次回归。
只统计金额,就明确选择金额
报表如果只需要金额总计,可以收窄参与聚合的列:
amount_total = selected["amount"].sum()
# 或者:确实需要表内所有数值列时
numeric_totals = selected.sum(numeric_only=True)
后一种写法会排除文本列,也可能排除被错误读成文本的数值字段。修改前先检查这些列是否本来应该参加统计,不能用 numeric_only=True 把导入类型错误一起隐藏。
min_count 又决定了空输入或不足数量的有效值是否允许得到零。例如,业务规定“没有有效金额就显示缺失”时,可以使用 selected["amount"].sum(min_count=1)。它改变的是空统计的含义,不是字符串转换修复的开关。
需要保留混合列结果时,使用修复版本
如果下游确实接收所有列的聚合结果,应在隔离环境选择兼容项目且包含修复的 pandas 3.0.2 或后续正式版本,保留原锁文件再比较输出。不能为了止住一次异常,把全部文本转换成零,或者把 sum() 包进宽泛异常处理后返回一个空字典。
比较原来有数据的表、筛选为空的表,以及金额全缺失的表;分别核对结果索引、值和缺失标记。字符串列的聚合含义还会受存储类型影响,不应把“所有空列一律为零”写成跨类型契约。若报表已经落库,先保留旧输出,再按真实业务键核对受影响日期,避免修复后悄悄覆盖历史统计。


