熊猫:将系列的数据类型更改为字符串

Posted

技术标签:

【中文标题】熊猫:将系列的数据类型更改为字符串【英文标题】:Pandas: change data type of Series to String 【发布时间】:2014-04-09 12:12:07 【问题描述】:

我在 Python 2.7 中使用 Pandas 'ver 0.12.0' 并有如下数据框:

df = pd.DataFrame('id' : [123,512,'zhub1', 12354.3, 129, 753, 295, 610],
                    'colour': ['black', 'white','white','white',
                            'black', 'black', 'white', 'white'],
                    'shape': ['round', 'triangular', 'triangular','triangular','square',
                                        'triangular','round','triangular']
                    ,  columns= ['id','colour', 'shape'])

id 系列由一些整数和字符串组成。它的dtype 默认为object。我想将id 的所有内容转换为字符串。我试过astype(str),它会产生下面的输出。

df['id'].astype(str)
0    1
1    5
2    z
3    1
4    1
5    7
6    2
7    6

1) 如何将id 的所有元素转换为字符串?

2) 我最终将使用id 为数据帧建立索引。与使用整数索引相比,在数据帧中使用字符串索引会减慢速度吗?

【问题讨论】:

不知道为什么你会得到那个输出,因为astype 对我来说很好,至少在 0.13.1 版本中,也许 0.12.0 有一个错误?在回答您的第二点时,是的,它可能会更慢,因为字符串比较不会比整数比较快,但我会先分析一下,这也取决于大小 您已经设置了列,对吧? df['id'] = df['id'].astype(str) @Andy Hayden,是的,我预约了,但这是我认为出乎意料的输出。 以什么方式出乎意料? 它只返回每个系列元素的第一个字符,正如我在df['id'].astype(str) 下的问题中提出的那样 【参考方案1】:

使用 pandas 字符串方法,即df['id'].str.cat()

【讨论】:

【参考方案2】:

对我来说 .to_string() 有效

df['id']=df['id'].to_string()

【讨论】:

【参考方案3】:

有两种可能:

使用.astype("str").astype("string")。如所见here 使用.astype(pd.StringDtype())。来自official documentation

【讨论】:

【参考方案4】:

反映最新实践的新答案:截至目前 (v1.2.4),astype('str')astype(str) 都不起作用。

As per the documentation,可以通过以下方式将Series转换为字符串数据类型:

df['id'] = df['id'].astype("string")

df['id'] = pandas.Series(df['id'], dtype="string")

df['id'] = pandas.Series(df['id'], dtype=pandas.StringDtype)

【讨论】:

这需要在此类问题的搜索结果中获得更高的排名。我尝试的其他一切都来自过时的建议!谢谢! @LizZ 很高兴!我的答案相对较新,但我认为它最终会达到顶峰。 此解决方案有效,而其他解决方案无效。这应该作为公认的答案!【参考方案5】:

对我来说它有效:

 df['id'].convert_dtypes()

在此处查看文档:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html

【讨论】:

【参考方案6】:

您的问题可以通过先转换为对象来轻松解决。转成object后,用"astype"转成str即可。

obj = lambda x:x[1:]
df['id']=df['id'].apply(obj).astype('str')

【讨论】:

【参考方案7】:

你可以使用:

df.loc[:,'id'] = df.loc[:, 'id'].astype(str)

这就是他们推荐此解决方案的原因:Pandas doc

TD;LR

反映一些答案:

df['id'] = df['id'].astype("string")

这将在给定示例中中断,因为它将尝试转换为无法处理“字符串”中的任何数字的StringArray。

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

对我来说,这个解决方案会引发一些警告:

> SettingWithCopyWarning:  
> A value is trying to be set on a copy of a
> slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead

【讨论】:

【参考方案8】:

就我个人而言,上述方法都不适合我。 做了什么:

new_str = [str(x) for x in old_obj][0]

【讨论】:

【参考方案9】:

你必须像这样分配它:-

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

【讨论】:

【参考方案10】:

您可以使用apply将id的所有元素转换为str

df.id.apply(str)

0        123
1        512
2      zhub1
3    12354.3
4        129
5        753
6        295
7        610

由 OP 编辑​​:

我认为这个问题与 Python 版本(2.7.)有关,这有效:

df['id'].astype(basestring)
0        123
1        512
2      zhub1
3    12354.3
4        129
5        753
6        295
7        610
Name: id, dtype: object

【讨论】:

谢谢,我会在电脑旁边试试这个并接受你的回答。你知道为什么astype(str ) 不起作用吗? @Zhubarb - 我刚试过,我得到了与df['id'].astype(str)相同的结果 与我发布的相同结果(不想要的)还是您使用df.id.apply(str) 得到的结果(想要的)? 我认为应该是.astype('str')而不是.astype(str) @ErnestSKirubakaran - 阅读之前的评论,试试.astype('str')

以上是关于熊猫:将系列的数据类型更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框中的多列更改为日期时间

将现有 MySQL 列更改为 JSON 数据类型

将数据框列类型从 int 更改为字符串 [重复]

如何将 pandas 数据框的数据类型更改为具有定义格式的字符串?

将列类型从整数更改为字符串

将熊猫数据框格式更改为另一种格式?