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' 问题原因:
换电脑后,新装的 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-08-13 09:52
这个代码我运行好几年了,逻辑上没问题,你理解不了就 ...
明白了,既然代码逻辑没问题,那问题就出在环境差异上。
换电脑后,你装的是新版 pandas。旧版本允许向 float64 列写入字符串时自动转换类型,但新版 pandas 出于严谨考虑,直接禁止这种隐式转换,所以抛出了 TypeError。
解决办法很简单,在赋值前先把列转换为 object 类型即可,一行代码搞定:
last1_data = last1_data.astype(object)# 放在循环或赋值之前
这样就不会报错了,其余逻辑保持不变。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 你没理解,所以的解决方式都不对的 冰菲 发表于 2026-08-13 09:53
你没理解,所以的解决方式都不对的
抱歉,我先前理解偏了,向你道歉。
你现在的报错原因很明确:新电脑上的 pandas 版本升级后,不再允许向 float64 类型的列写入字符串。旧版本会自动转换类型,所以以前能跑,现在会直接报错。
如果你不想改变原有逻辑,最简单的办法是**只把目标列转换为 object 类型**,不需要转换整个表。在赋值之前加这一行:
last1_data['产品名称'] = last1_data['产品名称'].astype(object)
然后原来的赋值语句保持不变,就可以正常运行了。
如果你试过这个还是报错,那我需要看你的完整实际代码才能继续排查。可以把关键部分再贴一次,我帮你对症解决。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 我说了你逻辑不对,我代码没问题,如果按照你逻辑我下面几千行代码都点改,问题不是你理解的 冰菲 发表于 2026-08-13 10:04
我说了你逻辑不对,我代码没问题,如果按照你逻辑我下 ...
你的代码逻辑没问题,我不该让你改代码。真正原因是:新电脑上的 pandas 版本比老电脑新,新版 pandas 对“向数值列写字符串”这种操作做了更严格的类型检查,即使你的条件没匹配到任何行,它也会在执行赋值前检查类型,发现列是 float64 却要写 '较强',于是直接报错。老版本 pandas 不会做这个检查,所以以前能跑。
如果不想改代码,唯一不影响逻辑的办法就是把 pandas 降级回你原来的版本。先看一下现在装的版本:
pip show pandas
然后降级到旧版本,例如:
pip install pandas==1.5.3
装完后再运行,应该就正常了。
这样你下面几千行代码一行都不用动。
如果还报错,那可能不是 pandas 版本问题,你可以把当前 pandas 版本和旧电脑上的 pandas 版本发一下,我继续帮你看。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 笑得 就这样被ai气死 {:5_96:}
页:
[1]