pandas将列表拆分为带正则表达式的列

she*_*nzy 7 python regex split dataframe pandas

我有一个字符串列表:

content
01/09/15, 10:07 - message1
01/09/15, 10:32 - message2
01/09/15, 10:44 - message3
Run Code Online (Sandbox Code Playgroud)

我想要一个数据框,如:

     date                message
01/09/15, 10:07          message1
01/09/15, 10:32          message2
01/09/15, 10:44          message3
Run Code Online (Sandbox Code Playgroud)

考虑到列表中的所有字符串都以该格式开头,我可以分开-,但我宁愿寻找一种更聪明的方法.

history = pd.DataFrame([line.split(" - ", 1) for line in content], columns=['date', 'message'])
Run Code Online (Sandbox Code Playgroud)

(之后我会将日期转换为日期时间)

任何帮助,将不胜感激.

Zer*_*ero 11

您可以使用str.extract- 命名组可以成为列名

In [5827]: df['content'].str.extract('(?P<date>[\s\S]+) - (?P<message>[\s\S]+)', 
                                     expand=True)
Out[5827]:
              date   message
0  01/09/15, 10:07  message1
1  01/09/15, 10:32  message2
2  01/09/15, 10:44  message3
Run Code Online (Sandbox Code Playgroud)

细节

In [5828]: df
Out[5828]:
                      content
0  01/09/15, 10:07 - message1
1  01/09/15, 10:32 - message2
2  01/09/15, 10:44 - message3
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了,谢谢!顺便说一句,如果要提取列以便将它们附加到现有数据帧上,我们可以使用 ``df = pd.concat([df, df_e], axis=1)```其中 df_e 是提取的数据帧。 (2认同)

jez*_*ael 8

使用str.splitby \s+-\s+- \s+是一个或多个空格:

df[['date','message']] = df['content'].str.split('\s+-\s+', expand=True)
print (df)
                      content             date   message
0  01/09/15, 10:07 - message1  01/09/15, 10:07  message1
1  01/09/15, 10:32 - message2  01/09/15, 10:32  message2
2  01/09/15, 10:44 - message3  01/09/15, 10:44  message3
Run Code Online (Sandbox Code Playgroud)

如果需要删除content列添加DataFrame.pop:

df[['date','message']] = df.pop('content').str.split('\s+-\s+', expand=True)

print (df)
              date   message
0  01/09/15, 10:07  message1
1  01/09/15, 10:32  message2
2  01/09/15, 10:44  message3
Run Code Online (Sandbox Code Playgroud)