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


76

我将Pandas'ver 0.12.0'与Python 2.7结合使用,并具有如下数据框:

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为String?

2)我最终将id用于为数据帧建立索引。与具有整数索引相比,在数据帧中具有String索引会降低速度吗?


1
不知道为什么您的输出astype对我来说很好,至少在0.13.1版本中,也许0.12.0有错误?回答您的第二点,是的,它可能会比较慢,因为字符串比较不会比整数比较快,但是我会首先介绍它,这也取决于大小
EdChum 2014年

您已经设置了列,对吗?df ['id'] = df ['id']。astype(str)
Andy Hayden

@Andy Hayden,是的,我进行了约会,但这是我认为出乎意料的输出。
朱巴卜2014年

意想不到的什么方式?
安迪·海登

1
正如我在df['id'].astype(str)
Zhubarb 2014年

Answers:


98

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

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

2
谢谢,当我坐在电脑旁并接受您的回答时,请尝试一下。你知道为什么astype(str )不起作用吗?
2014年

@Zhubarb-我刚刚尝试过,我得到的结果与df['id'].astype(str)
Amit Verma'14

我发布(不需要)的结果还是您得到df.id.apply(str)(期望)的结果?
朱巴卜2014年

3
我认为应该.astype('str')代替.astype(str)
Alex Klibisz '16

2
@ErnestSKirubakaran-阅读先前的评论,并尝试.astype('str')
Amit Verma


31

一个反映最新实践的新答案:从1.0.1版开始,既无效astype('str')也无效astype(str)

根据文档,可以通过以下方式将Series转换为字符串数据类型:

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

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

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

4

就我个人而言,以上都不对我有用。做了什么:

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

1

您可以使用:

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

1

通过将其首先转换为对象可以轻松解决您的问题。将其转换为对象后,只需使用“ astype”将其转换为str。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.