如何让正则表达式代码仅作用于空目标单元格
这是我的数据示例
街道地址 | 城市 | 州 | 邮政编码 |
---|---|---|---|
1 Main St 01123 | 温斯特德 | CT | |
1 Main St | 温斯特德 | CT | 01123 |
我正在尝试使用正则表达式和pandas来清理我手头的电子表格。问题是我的正则表达式代码替换了整列中的每一个单元格,即使里面有有效的数据。
我尝试了
df['Zip'] = df['StreetAddress'].str.extract(r'(\d{5})')
df['StreetAddress'] = df['StreetAddress'].str.replace(r'(\d{5})', '', regex=True)
这给了我
街道地址 | 城市 | 州 | 邮政编码 |
---|---|---|---|
1 Main St | 温斯特德 | CT | 01123 |
1 Main St | 温斯特德 | CT |
我希望能得到这样的结果
街道地址 | 城市 | 州 | 邮政编码 |
---|---|---|---|
1 Main St | 温斯特德 | CT | 01123 |
1 Main St | 温斯特德 | CT | 01123 |
1 个回答
2
我会使用布尔遮罩,这样可以避免覆盖已有的数据,而且效率更高,因为只会处理相关的行:
add = df['StreetAddress'].str.extract(r'(\d{5})', expand=False)
m = add.notna()
df.loc[m, 'Zip'] = add[m]
df.loc[m, 'StreetAddress'] = (df.loc[m, 'StreetAddress']
.str.replace(r' *\d{5}', '', regex=True)
)
另外:
df['Zip'] = df['StreetAddress'].str.extract(r'(\d{5})', expand=False).fillna(df['Zip'])
或者,正如@ouroboros1建议的那样,可以保留原始的Zip:
df['Zip'].fillna(df['StreetAddress'].str.extract(r'(\d{5})', expand=False))
输出:
StreetAddress City State Zip
0 1 Main St Winsted CT 01123
1 1 Main St Winsted CT 01123