python - 在第一个数字后使用条件拆分列
问题描述
我有一个包含地址的数据框,这些地址分为多列:
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_no
、house_no
和street
。
我不知道从哪里开始,所以任何帮助将不胜感激。
解决方案
让我们试试这个数据:
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
推荐阅读
- python - 如何在 django 管理站点上为扩展用户模型设置默认值?
- python - 如何通过模块中的标识符名称而不是闭包中的名称动态访问函数(由工厂创建)
- postgresql - 如何在 postgreSQL 中将点列表转换为 GEOM?
- firebase - Firebase - 如何根据当前事件参数和值创建新事件
- python - Python Tkinter,如何通过条目填写的列表自动更新字典?
- flutter - 嵌套的 ListView 构建器
- c - 需要帮助编写一个函数来获取 C 中每个城市的最低和最高温度
- visual-studio-code - vscode 上的 eslint 扩展有没有办法显示文件中的所有错误?
- powershell - Powershell 从 CSV 中删除列
- excel - Laravel 不强制文件下载