Pandas:将Series的数据类型更改为String

Zhu*_*arb 48 python series pandas

我在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'])
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

1)如何将所有元素转换id为String?

2)我最终将id用于索引数据帧.与具有整数索引相比,数据帧中的String索引会减慢速度吗?

Ami*_*mit 75

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

df.id.apply(str)

0        123
1        512
2      zhub1
3    12354.3
4        129
5        753
6        295
7        610
Run Code Online (Sandbox Code Playgroud)

由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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,当我坐在电脑旁并接受您的回答时,请尝试一下。您知道为什么`astype(str)`不起作用吗? (2认同)
  • @Zhubarb - 我刚刚尝试过,我得到了与 `df['id'].astype(str)` 相同的结果 (2认同)
  • 我相信它应该是`.astype('str')`而不是`.astype(str)` (2认同)
  • @ErnestSKirubakaran - 阅读上一条评论,尝试使用`.astype('str')` (2认同)
  • 也不适用于.astype('str') (2认同)

roc*_*ves 65

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

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

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

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

df['id'] = pandas.Series(df['id'], dtype=pandas.StringDtype)
Run Code Online (Sandbox Code Playgroud)


小智 40

您必须分配它,如下所示: -

df['id']= df['id'].astype(str)
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用:

df.loc[:,'id'] = df.loc[:, 'id'].astype(str)
Run Code Online (Sandbox Code Playgroud)

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

TD;LR

为了反映一些答案:

df['id'] = df['id'].astype("string")
Run Code Online (Sandbox Code Playgroud)

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

df['id']= df['id'].astype(str)
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)


小智 6

有两种可能:


man*_*ioz 5

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

new_str = [str(x) for x in old_obj][0]
Run Code Online (Sandbox Code Playgroud)