簡體   English   中英

基於不同長度的分隔符拆分pandas字符串列

[英]Split pandas string column based on varying length separator

我有一個包含文本字符串的df.LOCATION列。 每個字符串包括反映起始和目的地地址的文本 我的目標是拆分原點和目的地,這樣我就可以創建兩個單獨的列。

大多數情況下,原始文本和目標文本由字符串模式“to”分隔,例如“1234 A St. to 9876 B St.”。 我用過

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

這個偉大的工程,除了在某些行我有更多的“給”的文字,例如“從1234聖需要卡車回升至9876乙聖” - 在這種情況下,我仍然希望分為原點和目的地的兩個字符串,但我上面的代碼將返回三個列表,因為我以粗體突出顯示了額外的'to'字符串。

所以為了解決這個問題,我已經實施了

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

這正確地搜索了我不僅有文本'to'而且還有任何數字的字符串,這些數字表示在它之后有一個新地址,即目的地。 這是有效的,除了它實際上將刪除目標地址中的那些初始數字,但我想保留它們。

換句話說,我想檢測如上所述的模式,並且當它們被發現時,僅基於模式的“到”部分進行分割。

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.

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

這聽起來像是前瞻的問題。 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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM