首页 > 解决方案 > 在第一个数字后使用条件拆分列

问题描述

我有一个包含地址的数据框,这些地址分为多列:

address        postalcode      city       province       country
-----------------------------------------------------------------
123 Fake St     F1A2K3       Fakeville      ON              CA

我想将地址列分成两列,一列用于门牌号,另一列用于街道名称。因此,运行它之后,上面的 df 看起来像:

house_no    street        postalcode      city       province       country
----------------------------------------------------------------------------
  123       Fake St        F1A2K3       Fakeville      ON              CA

我一直通过简单地使用来做到这一点df[['house_no', 'street']] = df['address'].str.split(' ', 1, expand=True),它工作正常,直到我注意到address列下的一些地址结构为Apt 316 555 Fake Drive(或Unit 316 555 Fake Drive)。因此,当我运行我目前正在使用的那些时,我得到:

house_no          street        postalcode      city       province       country
---------------------------------------------------------------------------------
  Apt       316 555 Fake Drive     F1A2K3       Fakeville      ON           CA

显然,这不是我想要的。

所以本质上,我需要一种算法,在第一个数字之后拆分字符串,除非它以“Unit”或“Apt”开头,在这种情况下,它将采用它看到的第二个数字并将其拆分到house_no列中。

我需要在不丢失任何信息的情况下执行此操作,因此还要保留 Unit/Apt 编号(可以存储在house_no列中,但理想情况下会有自己的unit_no列)。因此,理想情况下,输出如下所示:

unit_no    house_no   street    postalcode     city      province   country
---------------------------------------------------------------------------------
 Apt 316     555    Fake Drive    F1A2K3     Fakeville     ON         CA

鉴于原始address列包含Apt 316 555 Fake Drive并且现在拆分为unit_nohouse_nostreet

我不知道从哪里开始,所以任何帮助将不胜感激。

标签: pythonpandas

解决方案


让我们试试这个数据:

df = pd.DataFrame({'address':['123 Fake Street', 'Apt 316 555 Fake Drive']})

# df
#                   address
# 0         123 Fake Street
# 1  Apt 316 555 Fake Drive

由于您没有指定是否要捕获Unit\Apt号码,我假设您没有:

df.address.str.extract('(?:Unit|Apt \d+ )?(?P<house_no>\d+) (?P<street>.*)$')

输出:

  house_no       street
0      123  Fake Street
1      555   Fake Drive

如果您想保留,只需稍作修改Unit/Apt

df.address.str.extract('(?P<unit_no>Unit|Apt \d+ )?(?P<house_no>\d+) (?P<street>.*)$')

输出:

    unit_no house_no       street
0       NaN      123  Fake Street
1  Apt 316       555   Fake Drive

推荐阅读