鱼C论坛

 找回密码
 立即注册
查看: 38|回复: 7

Python 处理Excel文件,运行报错

[复制链接]
发表于 2026-8-12 17:51:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Invalid value '文字' for dtype 'float64'
换电脑了,改了文件地址,其他没变,换新的电脑运行就报错了

提示这行错误,
last1_data.loc[(last1_data['产品名称'] == '文字') & (last1_data['费用'] == 0.04),'统计产品名称'] = '文字2'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-8-12 17:52:26 | 显示全部楼层
问题原因  
报错信息里已经说得很清楚了:你写入中文的那一列,被 pandas 识别成了 float64(浮点数类型)。Excel 里这一列可能大部分是数字或空值,pandas 就自动把它当成数值列,而数值列不能放中文,所以当你写入“文字2”时,pandas 就报错:Invalid value '文字' for dtype 'float64'。

另外,你这行代码还有一个逻辑问题:  
  1. last1_data.loc[(last1_data == '文字') & (last1_data == 0.04),'统计产品名称'] = '文字2'
复制代码

这里 last1_data == '文字' 是对整张表的每一个单元格做比较,不是针对某一列。而且同一个单元格不可能同时等于“文字”又等于 0.04,所以这个条件本身也有问题。

解决办法  
先检查数据类型:  
  1. print(last1_data.dtypes)
复制代码


然后把“统计产品名称”这一列转成字符串类型:  
  1. last1_data['统计产品名称'] = last1_data['统计产品名称'].astype(str)
复制代码


再按指定列写条件,比如:  
  1. condition = (last1_data['产品名称列'] == '文字') & (last1_data['数值列'] == 0.04)
  2. last1_data.loc[condition, '统计产品名称'] = '文字2'
复制代码


如果你是想表达“这一行中某个单元格是‘文字’,另一个单元格是 0.04”,应该这样写:  
  1. condition = (last1_data == '文字').any(axis=1) & (last1_data == 0.04).any(axis=1)
  2. last1_data.loc[condition, '统计产品名称'] = '文字2'
复制代码


最后,为了避免读取 Excel 时自动推断类型,可以在读取时强制指定列为字符串:  
  1. last1_data = pd.read_excel('你的文件.xlsx', dtype={'统计产品名称': str})
复制代码


换电脑后出现这种问题,通常是因为新电脑上 pandas 或 openpyxl 版本不同,导致 Excel 列类型被重新推断。优先检查 dtypes,再决定要不要转类型。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-8-12 17:56:36 | 显示全部楼层
FishC 发表于 2026-8-12 17:52
问题原因  
报错信息里已经说得很清楚了:你写入中文的那一列,被 pandas 识别成了 float64(浮点数类型) ...

你的代码运行不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-12 17:56:43 | 显示全部楼层
冰菲 发表于 2026-08-12 17:56
FishC 发表于 2026-8-12 17:52
问题原因  
报错信息 ...


你的代码运行不了,主要原因是之前给出的方案有两点不严谨:

1. last1_data = last1_data.astype(str) 会把整个表格所有列都变成字符串,后续计算容易出问题。  
2. 条件 (last1_data == '文字') & (last1_data == 0.04) 逻辑上永假,因为同一个单元格不可能同时等于“文字”和0.04。

请确认你的意图:是想在某一列(比如“类型”)为“文字”,且另一列(比如“数值”)为0.04时,修改“统计产品名称”列吗?如果是,请这样写:


  1. # 先确保“统计产品名称”列是字符串类型(object)
  2. last1_data['统计产品名称'] = last1_data['统计产品名称'].astype(object)

  3. # 按指定列做条件判断
  4. condition = (last1_data['类型'] == '文字') & (last1_data['数值'] == 0.04)

  5. # 满足条件时,给“统计产品名称”赋值
  6. last1_data.loc[condition, '统计产品名称'] = '文字2'
复制代码


如果“类型”和“数值”不是你的真实列名,请替换成实际列名。  
这样写既能避免 dtype 报错,也能正确匹配数据。

如果还是报 Invalid value 错误,那说明 last1_data['统计产品名称'] 这一列在读取时被推断为 float64。你可以在读取 Excel 时强制指定该列为文本:


  1. last1_data = pd.read_excel('你的文件.xlsx', dtype={'统计产品名称': str})
复制代码


然后再执行上面的修改代码即可。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-8-12 17:58:21 | 显示全部楼层
不符合我要求,你把原本数字都改字符串了,字符串是字符串,数字是数字,要同时满足这两个条件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-12 17:58:35 | 显示全部楼层
冰菲 发表于 2026-08-12 17:58
不符合我要求,你把原本数字都改字符串了,字符串是字 ...


问题分析  
报错是因为 '统计产品名称' 这一列被 pandas 推断为 float64 类型,无法写入中文。另外,原代码里 last1_data == '文字' 是对整个表格每个单元格进行比较,并且要求同一个单元格同时等于 '文字'0.04,这在逻辑上永远不可能成立,所以条件永远为假,但赋值时类型错误依然会报。

正确做法  
不要转换整张表,只把目标列 '统计产品名称' 转为 object(字符串型),其他数字列保持原样。同时,把条件改成针对具体列的比较,而不是整表比较。

假设你希望满足“某一列(比如A列)等于‘文字’,另一列(比如B列)等于0.04”时才修改,请这样写:


  1. # 只转换目标列,不影响其他数字列
  2. last1_data['统计产品名称'] = last1_data['统计产品名称'].astype(object)

  3. # 指定列做条件判断(把A列和B列换成你的真实列名)
  4. condition = (last1_data['A列'] == '文字') & (last1_data['B列'] == 0.04)

  5. # 满足条件时修改
  6. last1_data.loc[condition, '统计产品名称'] = '文字2'
复制代码


如果你担心读取时列类型被自动推断错,可以在 read_excel 时强制指定该列为字符串,其他列不受影响:


  1. last1_data = pd.read_excel('你的文件.xlsx', dtype={'统计产品名称': str})
复制代码


这样既保留了数字列的数值类型,又能正常写入中文。如果 '文字'0.04 确实要在同一列同时满足,那是不可能的,请检查你的业务逻辑。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-8-12 17:59:26 | 显示全部楼层
你没理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-12 17:59:42 | 显示全部楼层


非常抱歉,我之前没有完全理解您的意思。您说的“字符串是字符串,数字是数字”我明白了——您希望保留数字列的类型,不能把整个表格都转成字符串。而“同时满足这两个条件”指的是一个字符串列等于‘文字’,另一个数字列等于0.04,对吧?  

问题根源有两个:  
1. 您要写入中文的 ‘统计产品名称’ 列被pandas判定为float64,所以不能写入中文。  
2. 您写的条件 last1_data == '文字'last1_data == 0.04 是对整个表格每个单元格比较,并不是针对两个不同列,所以条件永远为假,但赋值时类型错误还是触发了。  

正确做法是:  
- 只把 ‘统计产品名称’ 这一列转成字符串类型(object),其他列保持原来的数字类型。  
- 条件改为指定两个不同列:例如 ‘类型’ 等于‘文字’ 且 ‘数值’ 等于0.04。  

示例代码如下(请把 ‘类型’ 和 ‘数值’ 换成您实际Excel里的列名):  


  1. # 只转换目标列,其他数字列不受影响
  2. last1_data = last1_data.astype(object)

  3. # 条件:类型列等于“文字”,且数值列等于0.04
  4. condition = (last1_data == '文字') & (last1_data == 0.04)

  5. # 满足条件时,修改“统计产品名称”列
  6. last1_data.loc = '文字2'
复制代码


如果读取Excel时您担心列类型被自动推断,可以在read_excel时强制指定目标列为字符串:  


  1. last1_data = pd.read_excel('你的文件.xlsx', dtype={'统计产品名称': str})
复制代码


这样 ‘统计产品名称’ 就会以文本类型读入,其他数字列依然是数字。您只需要把真正的列名替换进去,代码就能正常执行,不会再报 Invalid value 错误。  

如果您的原始条件确实是同一个单元格既要等于‘文字’又要等于0.04,那逻辑上不可能成立,请再检查您的业务需求。希望能帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-21 23:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表