冰菲 发表于 2026-8-12 18:00:50

Python 处理Excel 报错


【求助帖】请及时确认最佳答案,下次提问时可以得到更多关注,问题可以更快解决
Invalid value '文字' for dtype 'float64'
换电脑了,改了文件地址,其他没变,换新的电脑运行就报错了

提示这行错误,
last1_data.loc[(last1_data['产品名称'] == '文字') & (last1_data['费用'] == 0.04),'统计产品名称'] = '文字2'

产品名称
费用
统计产品名称
这三个是列的抬头

FishC 发表于 2026-8-12 18:00:59

这个报错是因为你要写入的列 统计产品名称 在读取 Excel 时被识别成了数值类型(float64),而赋值的 '文字2' 是字符串,Pandas 不允许往数值列里塞字符串。

换电脑后报错,很可能是新电脑上的 Pandas/openpyxl 版本不同,导致列类型推断不一样。

最简单的解决办法:先把这一列转成 object 或 str 类型,再赋值。


# 读取后先转换列类型
last1_data['统计产品名称'] = last1_data['统计产品名称'].astype(object)

# 然后再执行你的赋值操作
last1_data.loc[(last1_data == '文字') & (last1_data == 0.04), '统计产品名称'] = '文字2'


另外注意:你的条件 (last1_data == '文字') & (last1_data == 0.04) 是在整个 DataFrame 上做比较,同一个单元格不可能既等于 '文字' 又等于 0.04,所以这个条件永远是 False,不会有任何数据被修改。

如果你是想判断某一列的内容,应该写成类似这样:


last1_data.loc[(last1_data['产品名称'] == '文字') & (last1_data['费用'] == 0.04), '统计产品名称'] = '文字2'


根据你的实际表格结构调整条件即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:15:25

你理解的不对

FishC 发表于 2026-8-13 09:15:39

冰菲 发表于 2026-08-13 09:15
你理解的不对

抱歉,刚才理解有偏差,重新来看这个问题。

你报错的核心是:统计产品名称这一列在读取时被Pandas识别成了float64类型,而你要写入的文字2是字符串,所以赋值就会报Invalid value错误。

解决办法很简单,先把该列转为object类型再赋值:

last1_data['统计产品名称'] = last1_data['统计产品名称'].astype(object)
last1_data.loc[(last1_data == '文字') & (last1_data == 0.04), '统计产品名称'] = '文字2'

但注意你现在的条件写的是对整个DataFrame判断,逻辑上不对。如果是要找产品名称列等于文字,并且费用列等于0.04的行,然后改这些行的统计产品名称,应该写成:

last1_data.loc[(last1_data['产品名称'] == '文字') & (last1_data['费用'] == 0.04), '统计产品名称'] = '文字2'

这样就不会报错,也能正确匹配了。如果还是有问题,把表格片段发出来,我帮你看看具体逻辑。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:18:37

我代码是没问题的,如果你觉得是换电脑版本问题,“换电脑后报错,很可能是新电脑上的 Pandas/openpyxl 版本不同,导致列类型推断不一样。”,麻烦直接说安装哪个版本就行,代码不用改动

FishC 发表于 2026-8-13 09:18:46

冰菲 发表于 2026-08-13 09:18
我代码是没问题的,如果你觉得是换电脑版本问题,“换 ...

抱歉之前理解有误。既然代码没问题,那直接用旧版环境即可。建议安装以下版本(代码无需改动):

pip install pandas==1.3.5 openpyxl==3.0.10

新版 pandas 或 openpyxl 读取 Excel 时列类型推断更严格,导致 统计产品名称 被识别为 float64,安装旧版本后就会恢复正常,不需要改代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:21:56

A new release of pip is available: 25.3 -> 26.2.1
To update, run: python.exe -m pip install --upgrade pip
ERROR: Failed to build 'pandas' when getting requirements to build wheel

为啥失败了

FishC 发表于 2026-8-13 09:22:04

冰菲 发表于 2026-08-13 09:21
A new release of pip is available: 25.3 -> 26.2.1
...

这个报错说明当前电脑上的 Python 版本太高,pandas 1.3.5 不支持,pip 找不到现成的安装包,只能尝试从源码编译,结果编译失败。

解决办法有两个,任选一个就好:


[*] 安装 Python 3.9(比如 3.9.13),然后在那个环境下运行:
pip install pandas==1.3.5 openpyxl==3.0.10
[*] 如果不想换 Python,就安装兼容新版本 Python 的 pandas,比如:
pip install pandas==1.5.3 openpyxl==3.0.10


pandas 1.5.3 读取 Excel 时列类型推断和旧版基本一致,你的代码也可以直接运行,不用改动。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:27:26

A new release of pip is available: 25.3 -> 26.2.1
To update, run: python.exe -m pip install --upgrade pip
ERROR: Failed to build 'pandas' when getting requirements to build wheel
一样提醒

FishC 发表于 2026-8-13 09:27:42

冰菲 发表于 2026-08-13 09:27
A new release of pip is available: 25.3 -> 26.2.1
...

相同报错说明你的 Python 版本太高,pandas 1.5.3 也没有提供对应的预编译安装包,所以 pip 还是尝试从源码编译,结果失败了。

先确认一下你的 Python 版本,在命令行执行:

python --version

如果版本是 3.11 或更高,那么 1.5.3 和 1.3.5 都无法直接安装。既然你要求代码完全不动,最省事的方案是安装 Python 3.9 或 3.10,然后在这个环境里安装旧版 pandas。这样可以保证和原来电脑上的行为一致,代码自然不会报错。

具体步骤:安装 Python 3.9(安装时勾选 Add to PATH),然后打开命令行,先创建虚拟环境再安装依赖:

python -m venv myenv
myenv\Scripts\activate
pip install pandas==1.3.5 openpyxl==3.0.10

运行你的脚本时,先激活 myenv 环境即可。

如果不想换 Python,那就只能安装新版 pandas,但这样就可能需要微调代码来避免类型判断问题,和你的要求冲突。所以推荐换 Python 版本,一劳永逸。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:29:02

解决不了

FishC 发表于 2026-8-13 09:29:18

冰菲 发表于 2026-08-13 09:29
解决不了

既然不想改代码,可以从 Excel 文件本身入手。

打开你的 Excel 文件,找到 统计产品名称 这一列,选中整列,右键选择 设置单元格格式,在 数字 选项卡里选择 文本,然后保存。

之后再运行代码,Pandas 读取时会把这列当作字符串类型,写入 文字2 就不会报错了。

试试这个方法,不用改任何 Python 代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:32:14

我问问其他人吧,谢谢

FishC 发表于 2026-8-13 09:32:21

冰菲 发表于 2026-08-13 09:32
我问问其他人吧,谢谢

不客气,祝问题早日解决。如果后续还想尝试,可以优先考虑把 Excel 中 统计产品名称 这一列设为文本格式,这个方法最省事。有其他需要随时来问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 2026-8-13 09:32:56

你的方法越来越负责,都没必要用代码了

FishC 发表于 2026-8-13 09:33:14

冰菲 发表于 2026-08-13 09:32
你的方法越来越负责,都没必要用代码了

抱歉,之前给你绕弯子了。问题根源就是新版 pandas 把列识别成了数值类型,导致写入文字报错。想不改代码,也不改 Excel,那就只能让环境回到旧版。最省事的方式是安装 Anaconda,它自带 Python 3.9 和旧版 pandas,装好后直接用原来的脚本跑就行,什么都不用动。这样应该能解决你的问题,如果还不行,我再帮你想别的办法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 7 天前

你这是在干什么?发一堆相同题目。

smallwh 发表于 7 天前

很可能是 pandas 版本更新导致赋值时类型自动转换失效。我用 python3.8 运行 pandas2.0.3 未触发错误。

你可以按照以下方式逐个尝试:
1.强制转换类型:
使用现在的 pandas,对 DataFrame 对象添加一行代码,改一次即可满足程序下面所有操作:
last1_data['统计产品名称'] = last1_data['统计产品名称'].astype('object')
或者直接修改打开文件的方式:(可能会降低性能)
pandas.read_excel(r'XXXX\XXXX.xlsx',dtype='object')

2.安装指定版本的 pandas。
首先,卸载python3.14,安装python3.8,然后
pip install pandas
pip install openpyxl
python 3.8 会安装 pandas 较低(不是很低)的版本 2.0.3,应该可支持程序正常运行
注意: pandas 1.x 版本行为与 pandas 2.x 有不同,不能支持你想要的那种类型自动转换

以下是一些参考:
https://chat.deepseek.com/share/w4mbuyoiucsm0sslio
我的测试:
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import pandas
>>> pandas.read_excel(r'D:\data.xlsx')
   产品名称    费用统计产品名称
0    文字0.04   NaN
1    汉字1.04   NaN
23.562.04   NaN
3   33.04   NaN
4    文字4.04   NaN
>>> a = _
>>> a['统计产品名称']
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
Name: 统计产品名称, dtype: float64
>>> a.loc[(a['产品名称'] == '文字') & (a['费用'] == 0.04),'统计产品名称'] = '文字2'
>>> a
   产品名称    费用 统计产品名称
0    文字0.04    文字2
1    汉字1.04    NaN
23.562.04    NaN
3   33.04    NaN
4    文字4.04    NaN
>>> a['统计产品名称']
0    文字2
1    NaN
2    NaN
3    NaN
4    NaN
Name: 统计产品名称, dtype: object
页: [1]
查看完整版本: Python 处理Excel 报错