如何在正则表达式匹配后从数据帧中提取字符串

时间:2018-05-12 00:03:32

标签: python regex pandas

想要从pandas dataframe中的邮政编码后面的地址中提取城市名称。 鉴于: 10 rue des Treuils BP 12 33023, Bordeaux France 我想从数据框列中提取Bordeaux

城市名称始终位于逗号后面,但不能保证是一个单词。需要剥离国家名称,这将是法国,意大利等固定字符串。

更多法国城市名称的例子

  • Les Deux Alpes

  • Val dIsere

3 个答案:

答案 0 :(得分:1)

  

美国将是固定字符串,可以像以前一样被剥离   完全匹配

我的解决方案是删除国家/地区名称,这将只留下城市名称
这种方法似乎更容易,因为国名是固定的,可以根据property.manager轻松删除,即:

  1. list基于逗号split())的两个中的地址;
  2. ,国家/地区名称为replace();
  3. 使用panda的nothing来应用包含上述步骤的apply()功能。
  4. 使用panda的get_city()将列tolist()转换为列表。最后一步是可选的,因为它取决于您对城市名称的处理方式。
  5. 即:

    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

enter image description here

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