如何在 Pandas 数据框中将数据类型为对象的列转换为字符串?

179

当我将CSV文件读入到Pandas DataFrame时,每个列都被转换为自己的数据类型。我有一个列被转换为对象。我想对这个列执行字符串操作,比如拆分值并创建列表。但由于它的数据类型是对象,因此无法进行这样的操作。有人能告诉我如何将列的所有项目转换为字符串而不是对象吗?

我尝试了几种方法,但都没有成功。我使用了astype、str()、to_string等方法。

a=lambda x: str(x).split(',')
df['column'].apply(a)

或者

df['column'].astype(str)

有时候,在字符串操作中会因为存在无法识别的字符而失败。将您的数据粘贴到记事本中,看看是否有奇怪的符号出现在预期为空格(或其他内容)的位置。 - Dimanjan
9
这里的所有内容都已过时,请在重复的问题中回答:df['id'] = df['id'].astype("string") - AJ AJ
@AJAJ的答案是唯一一个将对象转换为字符串的方法,不过它将其转换为string[python],不知道这是否意味着除了"字符串"之外还有其他含义。 - undefined
4个回答

77

字符串数据类型具有可变长度,因此默认情况下存储为对象dtype。如果您想将它们存储为字符串类型,则可以这样做。


df['column'] = df['column'].astype('|S80') #where the max length is set at 80 bytes,

或者作为替代方案

df['column'] = df['column'].astype('|S') # which will by default set the length to the max len it encounters

19
你使用的是哪个Python版本?对我来说不起作用。 - VMEscoli
4
收到“TypeError:数据类型“ bytes256 ”不被理解”的错误消息,有什么建议原因? - Jason Goal
由于 pandas 几乎继承了整个 numpy 类型系统(除了 category),请参考 https://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#built-in-scalar-types 了解更多有关类型快捷方式的信息。 - ayorgo
1
适用于Python 3.8.2。 - gies0r
1
这对我来说以非拉丁字符(如á)结尾,会导致错误。 - Michal Skop

57

你试过将它重新分配给该列吗?

df['column'] = df['column'].astype('str') 

涉及到这个问题,pandas dataframe 存储字符串的指针,因此它的类型是 'object'。根据文档,您可以尝试:

df['column_new'] = df['column'].str.split(',') 

90
我尝试过了,但该列的数据类型即使在尝试后仍然保持为对象。 - Pranav
你能粘贴一下你的数据框的样本吗? - Hypothetical Ninja
我已经编辑了答案,请检查它是否有效。 - Hypothetical Ninja
17
它们两个都不起作用 :( - ihmpall
4
在数据框中有字符串,但dtype为object。 - Keith

34

虽然我没有直接回答问题,但这可能有助于其他人。

我有一个名为Volume的列,其中既包含-(无效/ NaN),也包含用,格式化的数字。

df['Volume'] = df['Volume'].astype('str')
df['Volume'] = df['Volume'].str.replace(',', '')
df['Volume'] = pd.to_numeric(df['Volume'], errors='coerce')
需要将其转换为字符串,才能应用于str.replacepandas.Series.str.replace
pandas.to_numeric

6
你可以尝试使用 df['column'].str. 然后使用任何字符串函数。Pandas文档中包括像split这样的函数。

2
不,pandas将存储指向字符串的指针,最终列类型将为“object”。 - asa
7
我相信pandas始终会将字符串列存储为对象。 - koshmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接