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

Posted

技术标签:

【中文标题】根据变长分隔符拆分熊猫字符串列【英文标题】:Split pandas string column based on varying length separator 【发布时间】:2019-05-17 10:34:07 【问题描述】:

我有一个包含文本字符串的 df.LOCATION 列。每个字符串包括反映始发地和目的地地址的文本。我的目标是拆分起点和终点,这样我就可以创建两个单独的列。

大多数情况下,源文本和目标文本由字符串模式“to”分隔,例如“1234 A 街至 9876 B 街”。我用过

map(lambda x: re.split(' to ', x), df.LOCATION) 

这很好用,除了在某些行中我在文本中有更多“to”,例如 “从 1234 A St. 需要提车到 9876 B St.” - 在这种情况下,我仍然想将起点和终点拆分为两个字符串,但我上面的代码将返回三个列表,因为我以粗体突出显示了额外的 ' to ' 字符串。

所以为了解决这个问题,我已经实现了

map(lambda x: re.split(' to \d+', x), dfJobs.LOCATION))

这会正确搜索字符串,其中我不仅有文本“to”,而且还有任何数字,表明它后面有一个新地址,即目的地。这是可行的,除了它实际上也会删除目标地址中的那些初始数字,但我想保留它们。

换句话说,我想检测上述模式,当发现它们时,仅根据模式的“到”部分进行拆分。

【问题讨论】:

【参考方案1】:
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.

【讨论】:

【参考方案2】:

您可以使用 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.

【讨论】:

【参考方案3】:

这听起来像是一个前瞻问题。 Lookahead 允许您匹配后续字符,但不能使用它们。

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

【讨论】:

以上是关于根据变长分隔符拆分熊猫字符串列的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中拆分没有给定分隔符的字符串

拆分(分解)熊猫数据框字符串条目以分隔行

根据多个分隔符拆分字符串

如何根据三个分隔符拆分字符串?

如何根据两个分隔符拆分字符串?

Oracle Regexp 根据第一次出现的分隔符拆分字符串