我想在我的Pandas数据框中将与所需格式不匹配的所有值设置为NaN。
不期望的格式的示例:
代码
df['Anfang L1'] = df['Anfang L1'].str.replace(r'(?!\D{3}.\d{2})', '')
正则表达式在没有负前瞻的情况下正常工作。regex表达式也可以与str.match函数中的负前瞻一起使用。
df[df['Anfang L1'].str.match('(?!\D{3}.\d{2})')]
感谢您对我的帮助。
PS:我也尝试了以下方法
df['Anfang L1'].replace(to_replace=r'(?!\D{3}.\d{2})', value='new', inplace=True)
问题在于正则表达式的定义。
A 负前瞻 A(?!B)
用于匹配所有A
的not后跟B
。
最终目标是将所有与\D{3}\.\d{2}
不匹配的条目设置为NaN
。
一种方法,
# Get a `series` of values which is true if it matches my format
match_my_correct_format = df['Anfang L1'].str.contains(r'\D{3}\.\d{2}')
# Set all rows which don't match my format to null
df[~match_my_correct_format] = np.nan
您可以使用
df['Anfang L1'].replace([r'^\d{2}\.\d{4}$'], np.nan, regex=True, inplace=True)
如果您需要匹配^\D{3}\.\d{2}$
模式以外的所有字符,请使用
df['Anfang L1'].replace([r'^(?!\D{3}\.\d{2}$).*'], np.nan, regex=True, inplace=True)
^\d{2}\.\d{4}$
模式匹配
^
-字符串开头\d{2}
-两位数字\.
-点\d{4}
-四位数$
-字符串结尾另一个模式表示:
^
-字符串开头(?!\D{3}\.\d{2}$)
-就在那儿,直到最后,不应该有\D{3}
-三个非数字字符\.
-点\d{2}
-两位数字.*
-字符串的其余部分。