想要从pandas dataframe中的邮政编码后面的地址中提取城市名称。
鉴于:
10 rue des Treuils BP 12 33023, Bordeaux France
我想从数据框列中提取Bordeaux
。
城市名称始终位于逗号后面,但不能保证是一个单词。需要剥离国家名称,这将是法国,意大利等固定字符串。
更多法国城市名称的例子
Les Deux Alpes
Val dIsere
答案 0 :(得分:1)
美国将是固定字符串,可以像以前一样被剥离 完全匹配
我的解决方案是删除国家/地区名称,这将只留下城市名称。
这种方法似乎更容易,因为国名是固定的,可以根据property.manager
轻松删除,即:
list
基于逗号(split()
)的两个中的地址; ,
国家/地区名称为replace()
; nothing
来应用包含上述步骤的apply()
功能。get_city()
将列tolist()
转换为列表。最后一步是可选的,因为它取决于您对城市名称的处理方式。即:
City
输出:
import pandas as pd
addresses = [['10 rue des Treuils BP 12 33023, Bordeaux France'],['Rua da Alegria 22, Lisboa Portugal'],['22 Some Street, NYC United States']]
df = pd.DataFrame(addresses,columns=['Address'])
countries = ['Portugal', 'France', 'United States']
def get_city(address):
city_country = address.split(",")[1]
for i in countries: city = city_country.replace(i, "")
return city.strip()
df['City'] = df['Address'].apply(get_city)
print (df['City'].tolist())
PS:
您可能需要['Bordeaux', 'Lisboa', 'NYC']
地址和国家/地区列表,以避免案例 SenSitIve 不匹配。
答案 1 :(得分:0)
如果我们认为您的正则表达式使用法语地址(以法国结尾),那么您可以使用:
/,\s([A-Z][A-Za-z\s-]+)\sFrance/gm
Link to the online regex simulator where I tested the expression
你之前提到过关于美国的问题,但实际上写入地址的方式完全不同,所以你必须为它制作另一个正则表达式。 (即: 4 Cross Lane Schererville,IN 46375)
答案 2 :(得分:0)
是的,也许一些高级正则表达式可以解决这个问题,但大熊猫的天真方法是:
import pandas as pd
import numpy as np
col = pd.Series(['10 rue des Treuils BP 12 33023, Bordeaux France',
'10 rue des Treuils BP 12 33023, Les Deux Alpes France',
'10 rue des Treuils BP 12 33023, New York United States'])
cities = np.where(col.str.endswith('United States'),
col.str.split(', ').str[1].str.split().str[:-2].str.join(' '),
col.str.split(', ').str[1].str.split().str[:-1].str.join(' '))
print(cities)
#['Bordeaux' 'Les Deux Alpes' 'New York']
更通用但不是那么有效的解决方案(但谁需要速度合适?)
import pandas as pd
col = pd.Series(['10 rue des Treuils BP 12 33023, Bordeaux France',
'10 rue des Treuils BP 12 33023, New York United States',
'10 rue des Treuils BP 12 33023, Seoul South Korea',
'10 rue des Treuils BP 12 33023, Brazzaville Republic of Congo'])
countries = {'United States': 2 , 'South Korea': 2, 'Republic of Congo': 3}
n = [next((countries[k] for k,v in countries.items() if i.endswith(k)), 1) for i in col]
cities = [' '.join(i.split(', ')[1].split()[:-y]) for i,y in zip(col,n)]
print(cities)
# ['Bordeaux', 'Les Deux Alpes', 'New York', 'Seoul', 'Brazzaville']
然后简单地回复:
df['city'] = cities