Pandas df.loc结合正则匹配修改DataFrame列值失效问题排查
代码失效原因
你的代码没有生效是两个问题导致的:
- 直接使用
==运算符对比Series值和正则表达式字符串,只能做精确的字符串等值匹配,不会触发正则解析逻辑,永远无法命中包含DATE的字段名。 - 你写的正则规则
^.*DATE+$存在语法错误:末尾的+量词作用于紧邻的前一个字符E,规则实际含义是匹配「以1个及以上E结尾、前面包含DATE」的字符串,和你要匹配含DATE字段名的需求完全不符。
正确实现写法
pandas提供了Series.str.contains()方法专门支持正则模式匹配,用该方法构造过滤条件即可完成修改,完整可运行代码如下:
import pandas as pd import re data = [['ACK_ID','TEXT',30], ['TOT_ACTIVE_PARTCP_CNT','NUMERIC'], ['ADMIN_SIGNED_DATE', "TEXT", 30], ['BENEF_RCVG_BNFT_CNT','NUMERIC'], ['SPONS_SIGNED_DATE','TEXT',30]] df = pd.DataFrame(data, columns=['FIELD_NAME', 'TYPE','SIZE (only for text fields)']) # 将TYPE列所有值为NUMERIC的内容修改为FLOAT df.loc[df["TYPE"] == "NUMERIC", "TYPE"] = "FLOAT" # 正则匹配FIELD_NAME中包含DATE的行,将对应TYPE列值修改为DATE df.loc[df["FIELD_NAME"].str.contains(r'DATE', regex=True), "TYPE"] = "DATE"
补充说明:
- 如果需要严格匹配以DATE结尾的字段名,可以将匹配规则替换为
r'DATE$'- 如果FIELD_NAME列存在空值,可以给
str.contains()传入na=False参数,避免空值引发判断异常,写法为df["FIELD_NAME"].str.contains(r'DATE', regex=True, na=False)
执行上述代码后得到的DataFrame和你给出的预期结构完全一致。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

