鱼C论坛

 找回密码
 立即注册
查看: 36|回复: 9

Python 处理Excel,运行代码报错

[复制链接]
发表于 2026-8-13 09:49:56 | 显示全部楼层 |阅读模式

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

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

x
换电脑后,运行代码报错,什么原因?

PS C:\Users\admin\Desktop\python> & C:\Users\admin\AppData\Local\Programs\Python\Python314\python.exe c:/Users/admin/Desktop/python/台账代码.py
Traceback (most recent call last):
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\blocks.py", line 1115, in setitem
    casted = np_can_hold_element(values.dtype, value)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\dtypes\cast.py", line 1792, in np_can_hold_element
    raise LossySetitemError
pandas.errors.LossySetitemError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\admin\Desktop\python\台账代码.py", line 258, in <module>
    last1_data.loc[(last1_data['产品名称'] == '机动') & (last1_data['比例'] == 0.04),'产品名称'] = '较强'  #如果产品名称为机动并且比例是0.6,那么统计名称为较强
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\indexing.py", line 938, in __setitem__
    iloc._setitem_with_indexer(indexer, value, self.name)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\indexing.py", line 1953, in _setitem_with_indexer
    self._setitem_with_indexer_split_path(indexer, value, name)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\indexing.py", line 2044, in _setitem_with_indexer_split_path
    self._setitem_single_column(loc, value, pi)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\indexing.py", line 2181, in _setitem_single_column
    self.obj._mgr.column_setitem(loc, plane_indexer, value)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\managers.py", line 1503, in column_setitem
    new_mgr = col_mgr.setitem((idx,), value)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\managers.py", line 604, in setitem
    return self.apply("setitem", indexer=indexer, value=value)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\managers.py", line 442, in apply
    applied = getattr(b, f)(**kwargs)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\blocks.py", line 1118, in setitem
    nb = self.coerce_to_target_dtype(value, raise_on_upcast=True)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python314\Lib\site-packages\pandas\core\internals\blocks.py", line 468, in coerce_to_target_dtype
    raise TypeError(f"Invalid value '{other}' for dtype '{self.values.dtype}'")
TypeError: Invalid value '较强' for dtype 'float64'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-8-13 09:50:04 | 显示全部楼层
问题原因:  
换电脑后,新装的 pandas 版本更严格了。你尝试把字符串 '较强' 写进一个原本是 float64 类型的列,旧版本可能自动转换,新版本直接报错。

解决办法:  
先把这一列转换成 object 类型,再赋值就不会报错了。


  1. # 在修改之前,先转换列类型
  2. last1_data['产品名称'] = last1_data['产品名称'].astype(object)
复制代码


另外,你的条件写法也有问题:
last1_data == '机动' & last1_data == 0.04  
这个条件本身是矛盾的(一列不可能同时等于字符串和数字),而且容易引发歧义。建议改成明确指定列:


  1. last1_data.loc[(last1_data['产品名称'] == '机动') & (last1_data['比例'] == 0.04), '产品名称'] = '较强'
复制代码


这样既解决了类型报错,也让条件更清晰。

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

使用道具 举报

 楼主| 发表于 2026-8-13 09:52:13 | 显示全部楼层
这个代码我运行好几年了,逻辑上没问题,你理解不了就不用回复了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-13 09:52:18 | 显示全部楼层
冰菲 发表于 2026-08-13 09:52
这个代码我运行好几年了,逻辑上没问题,你理解不了就 ...


明白了,既然代码逻辑没问题,那问题就出在环境差异上。

换电脑后,你装的是新版 pandas。旧版本允许向 float64 列写入字符串时自动转换类型,但新版 pandas 出于严谨考虑,直接禁止这种隐式转换,所以抛出了 TypeError

解决办法很简单,在赋值前先把列转换为 object 类型即可,一行代码搞定:


  1. last1_data = last1_data.astype(object)  # 放在循环或赋值之前
复制代码


这样就不会报错了,其余逻辑保持不变。

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

使用道具 举报

 楼主| 发表于 2026-8-13 09:53:12 | 显示全部楼层
你没理解,所以的解决方式都不对的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-13 09:53:37 | 显示全部楼层
冰菲 发表于 2026-08-13 09:53
你没理解,所以的解决方式都不对的


抱歉,我先前理解偏了,向你道歉。

你现在的报错原因很明确:新电脑上的 pandas 版本升级后,不再允许向 float64 类型的列写入字符串。旧版本会自动转换类型,所以以前能跑,现在会直接报错。

如果你不想改变原有逻辑,最简单的办法是**只把目标列转换为 object 类型**,不需要转换整个表。在赋值之前加这一行:


  1. last1_data['产品名称'] = last1_data['产品名称'].astype(object)
复制代码


然后原来的赋值语句保持不变,就可以正常运行了。

如果你试过这个还是报错,那我需要看你的完整实际代码才能继续排查。可以把关键部分再贴一次,我帮你对症解决。

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

使用道具 举报

 楼主| 发表于 2026-8-13 10:04:10 | 显示全部楼层
我说了你逻辑不对,我代码没问题,如果按照你逻辑我下面几千行代码都点改,问题不是你理解的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-8-13 10:04:29 | 显示全部楼层
冰菲 发表于 2026-08-13 10:04
我说了你逻辑不对,我代码没问题,如果按照你逻辑我下 ...


你的代码逻辑没问题,我不该让你改代码。真正原因是:新电脑上的 pandas 版本比老电脑新,新版 pandas 对“向数值列写字符串”这种操作做了更严格的类型检查,即使你的条件没匹配到任何行,它也会在执行赋值前检查类型,发现列是 float64 却要写 '较强',于是直接报错。老版本 pandas 不会做这个检查,所以以前能跑。

如果不想改代码,唯一不影响逻辑的办法就是把 pandas 降级回你原来的版本。先看一下现在装的版本:

  1. pip show pandas
复制代码


然后降级到旧版本,例如:

  1. pip install pandas==1.5.3
复制代码


装完后再运行,应该就正常了。

这样你下面几千行代码一行都不用动。

如果还报错,那可能不是 pandas 版本问题,你可以把当前 pandas 版本和旧电脑上的 pandas 版本发一下,我继续帮你看。

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

使用道具 举报

发表于 2026-8-13 10:05:21 | 显示全部楼层
笑得 就这样被ai气死
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-8-13 10:06:25 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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