DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
RackNerd;$21.99/年 · 1GB KVM

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() 包进宽泛异常处理后返回一个空字典。

比较原来有数据的表、筛选为空的表,以及金额全缺失的表;分别核对结果索引、值和缺失标记。字符串列的聚合含义还会受存储类型影响,不应把“所有空列一律为零”写成跨类型契约。若报表已经落库,先保留旧输出,再按真实业务键核对受影响日期,避免修复后悄悄覆盖历史统计。