python - 多次拆分字符串并将结果作为新的DataFrame返回
问题描述
我正在尝试反复拆分熊猫列。我想无限期地找到两个字符串之间的字符串。例如,假设我有来自以下输入的 pandas 列:
import numpy as np
import pandas as pd
data=np.array([["'abc'ad32kn'def'dfannasfl[]12a'ghi'"],
["'jk'adf%#d1asn'lm'dfas923231sassda"],
["'nop'ad&@*-0'qrs'd2&*@^#!!sda'tuv'dasdj_23'w'823a&@'xyz'adfa"]])
df = pd.DataFrame({'Practice Column': data.ravel()})
print(df)
然后,我想通过打开和关闭引号来拆分这些字符串'...'
,然后取出里面的内容。所以,我的最终输出是:
有人可以帮我吗?谢谢。
解决方案
让我们extractall
在这里使用:
df['Practice Column'].str.extractall(r"'(.*?)'").unstack(1)[0].fillna('')
match 0 1 2 3 4
0 abc def ghi
1 jk lm
2 nop qrs tuv w xyz
该模式'(.*?)'
查找单引号内的所有字符串实例。更多信息 -
' # Match opening quote
( # Open capture group
.*? # Non-greedy match for anything
) # End of capture group
' # Match closing quote
要将其与 合并df
,您可以使用join
:
v = df.join(df['Practice Column']
.str.extractall(r"'(.*?)'").unstack(1)[0].fillna(''))
或者,将“练习栏”分配回去:
v = df['Practice Column'].str.extractall(r"'(.*?)'").unstack(1)[0].fillna('')
v.insert(0, 'Practice Column', df['Practice Column'])
print(v)
match Practice Column 0 1 2 3 4
a 'abc'ad32kn'def'dfannasfl[]12a'ghi' abc def ghi
b 'jk'adf%#d1asn'lm'dfas923231sassda jk lm
c 'nop'ad&@*-0'qrs'd2&*@^#!!sda'tuv'dasdj_23'w'8... nop qrs tuv w xyz
另一种具有列表理解的解决方案(用于性能)。
import re
p = re.compile("'(.*?)'")
pd.DataFrame([
p.findall(s) for s in df['Practice Column']]).fillna('')
0 1 2 3 4
0 abc def ghi
1 jk lm
2 nop qrs tuv w xyz
如果有 NaN,这将不起作用,因此这里是上述解决方案的修改版本。您需要先删除 NaN。
pd.DataFrame([
p.findall(s) for s in df['Practice Column'].dropna()]
).fillna('')
0 1 2 3 4
0 abc def ghi
1 jk lm
2 nop qrs tuv w xyz
推荐阅读
- php - PHP SQL回显行问题
- javascript - 将数据推送到firebase实时数据库时如何更改密钥
- java - 如何在 Java 中正确创建和导入包
- html - 查询不透明度 - HTML、CSS 和 Bootstrap
- java - Java 套接字:不支持 HTTP/1.1 505 HTTP 版本
- mysql - SQL查询获取包含时间范围内多个实例的值
- r - 在 R 中合并 2 个列表列表
- angular - 如何在Angular 4中一次打印多个标签?
- php - 将 */AMP 翻译成 *?AMP
- php - 未设置 AuthType;MAMP 500 配置错误:无法执行身份验证