所以我想将街道和门牌号与地址行分开。我可以根据最后一个空格(我的代码如下)拆分地址。但这对第 3 行中的情况没有帮助,其中门牌号实际上包含空格。
address street house_number
my street 6 my street 6
my street 10a my street 10a
next street 5 c next street 5 c
next street100 next street 100
我最好的尝试,这对第三种情况没有帮助:
df['street'] = df['address'].apply(lambda x: ' '.join(x.split(' ')[:-1]))
df['house_number'] = df['address'].apply(lambda x: x.split(' ')[-1])
我的想法是:识别字符串中的第一个数字(数字)并将字符串从那里分成两部分。正则表达式?我试过了,但没有解决
复制代码
data = {'address': ['my street 6', 'my street 10a', 'next street 5 c', 'next street100'],
'street': ['my street', 'my street', 'next street', 'next street'],
'house_number': ['6', '10a', '5 c', '100']
}
df = pd.DataFrame(data)
已编辑:添加了第 4 个案例
答案 0 :(得分:1)
我认为这样做可以;使用 .str.split() 按数字前的空格进行分割
数据
df=pd.DataFrame({'address':['my street 6','my street 10a','next street 5 c']})
解决方案
df.address.str.split('\s(?=\d)', expand=True).rename(columns={0:'street',1:'house_number'})
结果
street house_number
0 my street 6
1 my street 10a
2 next street 5 c
如果您想包含原始列。请尝试;
df1=df.join(df.address.str.split('\s(?=\d)', expand=True).rename(columns={0:'street',1:'house_number'}))
address street house_number
0 my street 6 my street 6
1 my street 10a my street 10a
2 next street 5 c next street 5 c
正则表达式说明
RegEx 查找空格 \s 的位置,条件是 (?= ) 后面跟着一个数字 (?=\d)
答案 1 :(得分:0)
对于我的问题中的第 4 种情况,这是我想出的解决方案:
df['street'] = df.address.str.split('\d', expand=True)[0]
df['house_number'] = df.address.str.split('.(?=\d)', n=1, expand=True)[1]
所以街道的逻辑只是字符串中第一个数字之前的所有内容。对于门牌号码,我从找到的第一个数字左边的字符开始拆分,并将拆分限制为 2 部分(部分 0 和 1,这就是为什么 n=1 而不是 2 部分的原因)