我试图重复拆分熊猫柱。我想无限期地找到两个字符串之间的字符串。例如,假设我在下面的输入中有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)
然后,我想通过打开和关闭引号'...'
来拆分这些字符串,然后取其中的内容。因此,我的最终输出将是:
有人可以帮我吗? 谢谢。
答案 0 :(得分:3)
让我们在这里使用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