首页 > 解决方案 > Pandas 要求我将列设为字符串,但我不能

问题描述

我正在尝试将 pandas 列转换为字符串以便使用str.extract().

当我运行时print(data.dtypes),这就是我所看到的:

:Address Line 1:         object
:City:                   object
Address Line 2:          object
Case Initiation Date:    object
Case Number:             object
Case Status:             object
Defendants               object
Demand Amount:           object
Motion Status            object
Zip:                     object
6                        object
dtype: object

我正在尝试data['Motion Status']使用正则表达式拆分变量,但遇到了障碍。首先,快速浏览一下data['Motion Status']

0    b'01/31/202008:30155'
1    b'02/03/202008:30155'
2    b'02/03/202008:30155'
3    b'02/04/202008:30155'
4    b'02/04/202008:30155'
Name: Motion Status, dtype: object

您会注意到它的格式为 dd/mm/yyyy + hh:mm + 3 位数字。这是我一直用来尝试从时间中解析出日期的代码(我会在它工作后执行“155”):

data['Motion Status (date)'] = data['Motion Status'].str.extract('\d{2}\/\d{2}\/\d{4}', expand=True)

当我运行它时,它返回错误TypeError: Cannot use .str.extract with values of inferred dtype 'bytes'.我已经尝试了四种不同的解决方案,但它们都没有奏效(当我重新运行该str.extract行时返回与上面相同的错误消息):

data['Motion Status'] = data['Motion Status'].astype('|S')

data['Motion Status'] = data['Motion Status'].astype('str')

data['Motion Status'] = data['Motion Status'].astype(str)

data.astype(str)['Motion Status'].map(lambda x: type(x))

有谁可以帮我离开这里吗?我真的不喜欢将此变量转换为字符串。我只想能够解析出日期、时间和最后的“155”(顺便说一下,它并不总是“155”——仅在前 20 行左右)。

任何帮助,将不胜感激!

更新:

我现在可以运行这行代码data['Motion Status (date)'], data['Time'], data['Other'] = data['Motion Status'].str.extract('(\d{2})/(\d{2})/(\d{4})', expand=True)并且它执行没有错误。老实说,我不知道我做了什么来让这个运行......但是,我现在遇到了一个稍微不同的问题,代码创建了三个新变量,但它们在所有行中都填充了零、一或二(而不是我希望得到的 data['Motion Status'] 字符串的部分。例如

   Motion Status (date)  Time  Other
0                     0     1      2
1                     0     1      2
2                     0     1      2
3                     0     1      2
4                     0     1      2

所以我并没有完全回到第一方,但我仍然无法解析出字符串的不同部分。

标签: pythonregexstringpandastypes

解决方案


您在列中有字节。decode它首先使用str.decode方法:

s

#0    b'02/03/202008:30155'
#1    b'02/03/202008:30155'
#2    b'02/04/202008:30155'
#3    b'02/04/202008:30155'
#dtype: object

s.str.decode('UTF-8').str.extract('(\d{2})/(\d{2})/(\d{4})', expand=True)

#    0   1     2
#0  02  03  2020
#1  02  03  2020
#2  02  04  2020
#3  02  04  2020

推荐阅读