如何让正则表达式代码仅作用于空目标单元格

2 投票
1 回答
44 浏览
提问于 2025-04-12 04:25

这是我的数据示例

街道地址 城市 邮政编码
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

撰写回答