我使用panda读入两个数据集,并重新分配每个数据集的value
列,一个数据集是csv,加载了pd.read_csv()
,另一个数据集是xlsx,加载了来自sxl库的Workbook.sheets()
。
在重新赋值之前,两个value列都是string数据类型(用df.dtypes
检查)。
df["value"] = df["value"].replace({"A": 0, "B": 1})
对于csv中的数据,此行将出错
ValueError: Cannot set non-string value '0' into a StringArray.
我得到了类似的错误
ValueError: Cannot set non-string value 'True' into a StringArray
当我尝试将字符串类型的列重新分配为True/False时。当我在Excel文档中的数据的值列上运行同一行时,没有错误。
我可以通过在用.astype('object')
重新赋值之前强制转换值来修复这个错误,但我不确定为什么会这样--两个 Dataframe 中的value
都是字符串类型。
我的同事没有得到这个错误,所以可能不需要创可贴,我运行的是Python 3.9.4、panda 1.5.3和numpy 1.22.0。
1条答案
按热度按时间j5fpnvbx1#
长话短说,
"value"
列的dtype是'string'
,它是一个extension dtype for string data,也可以为空,这意味着该列中的值可以是字符串或NaN,当您试图将该列中的值替换为整数("A" -> 0
和"B" -> 1
)时,会引发错误,因为该列中的值不能为整数。下面的代码将重现此错误:
如果替换值是字符串,则不会出现错误,即以下内容不会引发任何错误:
为什么
dtype=object
没有引发任何错误?Pandas对象dtype可以保存任何Python对象,换句话说,任何东西都可以放在对象dtype的列中。Python对象,如整数、字符串、浮点数、甚至列表、字典等,都可以存储在
object
列中。因此,在这样的列中,用整数替换字符串是没有问题的。但是,在这种情况下,列变成了混合列。要查看
'value'
列中作为Python对象的值,请对该列调用tolist()
。注意
dtype=str
也将列dtype转换为object
(但值实际上是字符串),因此如果列dtype使用astype(str)
进行更改,则其值也可以替换为整数。