使用 python 中的条件逐行拆分字符串
split string row wise with condition in python
我在一列中有一些字符串,我只想将括号内 不是 的单词展开。该列看起来像这样
pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})
我希望输出看起来像这样
pd.DataFrame(data={'a': ['first','string','(second,string)','third','string','(another,string,here)']})
这种方法可行,但我不想每次都输入行号
re.split(r',(?![^()]*\))', x['a'][0])
re.split(r',(?![^()]*\))', x['a'][1])
re.split(r',(?![^()]*\))', x['a'][2])
我以为我可以使用 lmbda 函数,但我无法让它工作。感谢您查看此内容
x['a'].apply(lambda i: re.split(r',(?![^()]*\))', i))
我不清楚您的 DataFrame 中的元素是否在括号之间有多个组。鉴于这种疑问,我实施了以下措施:
import pandas as pd
import re
df = pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})
pattern = re.compile("([^\(]*)([\(]?.*[\)]?)(.*)", re.IGNORECASE)
def findall(ar, res = None):
if res is None:
res = []
m = pattern.findall(ar)[0]
if len(m[0]) > 0:
res.extend(m[0].split(","))
if len(m[1]) > 0:
res.append(m[1])
if len(m[2]) > 0:
return findall(ar[2], res = res)
else:
return res
res = []
for x in df["a"]:
res.extend(findall(x))
print(pd.DataFrame(data={"a":res}))
本质上,您递归地扫描匹配项的最后部分,直到在字符串之间找不到更多单词。如果顺序不是问题,解决方案会更简单。
我在一列中有一些字符串,我只想将括号内 不是 的单词展开。该列看起来像这样
pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})
我希望输出看起来像这样
pd.DataFrame(data={'a': ['first','string','(second,string)','third','string','(another,string,here)']})
这种方法可行,但我不想每次都输入行号
re.split(r',(?![^()]*\))', x['a'][0])
re.split(r',(?![^()]*\))', x['a'][1])
re.split(r',(?![^()]*\))', x['a'][2])
我以为我可以使用 lmbda 函数,但我无法让它工作。感谢您查看此内容
x['a'].apply(lambda i: re.split(r',(?![^()]*\))', i))
我不清楚您的 DataFrame 中的元素是否在括号之间有多个组。鉴于这种疑问,我实施了以下措施:
import pandas as pd
import re
df = pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})
pattern = re.compile("([^\(]*)([\(]?.*[\)]?)(.*)", re.IGNORECASE)
def findall(ar, res = None):
if res is None:
res = []
m = pattern.findall(ar)[0]
if len(m[0]) > 0:
res.extend(m[0].split(","))
if len(m[1]) > 0:
res.append(m[1])
if len(m[2]) > 0:
return findall(ar[2], res = res)
else:
return res
res = []
for x in df["a"]:
res.extend(findall(x))
print(pd.DataFrame(data={"a":res}))
本质上,您递归地扫描匹配项的最后部分,直到在字符串之间找不到更多单词。如果顺序不是问题,解决方案会更简单。