我有一个df.LOCATION列,其中包含文本字符串。每个字符串都包含反映原始地址和目标地址的文本。我的目标是拆分起点和目的地,以便创建两个单独的列。
在大多数情况下,原始文本和目标文本由字符串模式“ to”分隔,例如“ 1234 A St.至9876 B St.”。我用过
map(lambda x: re.split(' to ', x), df.LOCATION)
这很好用,除了在某些行中我在文本中有更多“收件人”例如 “从1234 A St.起,需要 接送卡车到9876 BSt。” -在这种情况下,我仍想将两个字符串作为起点和终点,但由于我用粗体突出显示了多余的'to'字符串,因此上面的代码将返回三个列表。
为解决这个问题,我已经实现
map(lambda x: re.split(' to \d+', x), dfJobs.LOCATION))
这可以正确地搜索字符串,其中我不仅有文本“ to”,而且还有任何数字,这些数字指示在其后有一个新地址,即目的地。这是可行的,除了它实际上也将删除目标地址中的那些初始数字,但我想保留它们。
换句话说,我想检测诸如此类的模式,当发现它们时,仅根据模式的“ to”部分进行分割。
答案 0 :(得分:3)
df = pd.DataFrame(
{'Location' : ['1234 A St. to 9876 B St.',
'From 1234 A St. to pick up truck to 9876 B St.']})
df
Location
0 1234 A St. to 9876 B St.
1 From 1234 A St. to pick up truck to 9876 B St.
您可以使用r' to\D+'
从“至”到第一个数字开始匹配。要进行矢量化,请使用str.split
。
v = df.Location.str.split(r' to\D+', expand=True)
v.columns = ['source', 'destination']
df.join(v)
Location source destination
0 1234 A St. to 9876 B St. 1234 A St. 9876 B St.
1 From 1234 A St. to pick up truck to 9876 B St. From 1234 A St. 9876 B St.
答案 1 :(得分:1)
您可以使用rsplit并使用n = 1仅返回一个拆分
df[['source', 'destination']] = df.Location.str.rsplit('to', 1, expand = True)
Location source destination
0 1234 A St. to 9876 B St. 1234 A St. 9876 B St.
1 From 1234 A St. to pick up truck to 9876 B St. From 1234 A St. to pick up truck 9876 B St.
答案 2 :(得分:0)
这听起来像是一个问题。前瞻允许您匹配后续字符,但不消耗它们。
>>> re.split(' to (?=\d)', 'From 1234 A St. need to pick up truck to 9876 B St')
['From 1234 A St. need to pick up truck', '9876 B St']