根据变长分隔符拆分大熊猫字符串列

时间:2018-12-17 04:00:32

标签: python regex python-3.x pandas split

我有一个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”部分进行分割。

3 个答案:

答案 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']