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

Python 处理Excel,运行代码报错

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

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'

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

问题原因:
换电脑后,新装的 pandas 版本更严格了。你尝试把字符串 '较强' 写进一个原本是 float64 类型的列,旧版本可能自动转换,新版本直接报错。

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


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


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


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


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

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

冰菲 发表于 2026-8-13 09:52:13

这个代码我运行好几年了,逻辑上没问题,你理解不了就不用回复了

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

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

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

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

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


last1_data = last1_data.astype(object)# 放在循环或赋值之前


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

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

冰菲 发表于 2026-8-13 09:53:12

你没理解,所以的解决方式都不对的

FishC 发表于 2026-8-13 09:53:37

冰菲 发表于 2026-08-13 09:53
你没理解,所以的解决方式都不对的

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

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

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


last1_data['产品名称'] = last1_data['产品名称'].astype(object)


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

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

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

冰菲 发表于 2026-8-13 10:04:10

我说了你逻辑不对,我代码没问题,如果按照你逻辑我下面几千行代码都点改,问题不是你理解的

FishC 发表于 2026-8-13 10:04:29

冰菲 发表于 2026-08-13 10:04
我说了你逻辑不对,我代码没问题,如果按照你逻辑我下 ...

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

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

pip show pandas

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

pip install pandas==1.5.3

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

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

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

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

jambo1996 发表于 2026-8-13 10:05:21

笑得 就这样被ai气死

冰菲 发表于 2026-8-13 10:06:25

{:5_96:}
页: [1]
查看完整版本: Python 处理Excel,运行代码报错