[英]Split text in a column into three columns
這個問題是Pietro關於如何將一列拆分為多列的奇妙答案的后續措施。 我的目標是從現有數據框中獲取一列,將其拆分到一個空間上,然后獲取前三個/四個拆分值,並將每個值放置在特定的列中,而忽略其余部分。
此拆分的問題在於,行之間的空格數有所不同。 有時數據顯示為“ Fort Lee NJ 07024”。 在其他時間,它看起來像“ NY NY 10000”。 我不確定是否有簡單的解決方法。
df['City, State, Zip'].str.split()
# Returns a variable length row.
# I need to take the first three or four values, and add them to columns: City/State/Zip
假設狀態和郵政編碼始終存在並且包含有效數據,則解決此問題的一種方法是首先拆分字符串。 state和zip分別只是倒數第二和最后一列。 我已經使用列表city_state_zip
從city_state_zip
提取它們。 為了提取城市,我使用了嵌套列表推導和join
。 最后兩個元素是州和郵政編碼,因此列表的長度減去兩個就可以告訴您城市名稱中包含多少個元素。 然后,您只需要將它們加入一個空格即可。
df = pd.DataFrame({'city_state_zip': ['Fort Lee NJ 07024',
'NY NY 10000',
'Carmel by the Sea CA 93922']})
city_state_zip = df.city_state_zip.apply(lambda x: x.split())
df['city'] = [" ".join([x[c] for c in range(len(x) - 2)]) for x in city_state_zip]
df['state'] = [x[-2] for x in city_state_zip]
df['zip'] = [x[-1] for x in city_state_zip]
>>> df
city_state_zip city state zip
0 Fort Lee NJ 07024 Fort Lee NJ 07024
1 NY NY 10000 NY NY 10000
2 Carmel by the Sea CA 93922 Carmel by the Sea CA 93922
編輯:根據DSM的建議,看起來最后兩個字是郵政編碼的狀態,在這種情況下,您可以
df = pd.DataFrame({'city_state_zip': ['Fort Lee NJ 07024',
'NY NY 10000',
'Carmel by the Sea CA 93922']})
In [50]: regex = '(?P<City>[a-zA-z ]*) (?P<State>[A-Z]{2}) (?P<Zip>[\d-]*)'
df.city_state_zip.str.extract(regex)
Out[50]:
City State Zip
0 Fort Lee NJ 07024
1 NY NY 10000
2 Carmel by the Sea CA 93922
此方法使用正則表達式使用多個命名組進行提取,每個命名組分別對應於City,State和Zip。 如圖所示,提取方法的結果是一個具有3列的數據框。 組的語法是用括號將每個組的正則表達式括起來。 要命名組,請在組正則表達式前的括號中插入?P<group name>
。 此解決方案假定城市名稱僅包含大小寫字母,空格和統計縮寫。 恰好包含2個大寫字母,但如果不是這種情況,則可以對其進行調整。 請注意,這里的正則表達式中各組之間的空格很重要,因為它們代表城市,州和郵編之間的空格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.