pandas 为匹配特定模式的字符串添加前缀

o8x7eapl  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(139)

基于包含日期的DataFrame

import pandas as pd
df = pd.DataFrame({'month':['2','5','8'],'year':['2001',' 89','1999']})
print(df)
  month  year
0     2  2001
1     5    89
2     8  1999

我想用19为所有只包含2位数字的年份示例添加前缀,这样得到的DataFrame为

month  year
0     2  2001
1     5  1989
2     8  1999

我试

pattern = r'[^\d]*\d{2}[^\d]*'
replacement = lambda m: '19'+m
df.year = df.year.str.replace(pattern,replacement)
print(df)
    month  year
0     2   NaN
1     5   NaN
2     8   NaN

但这行不通。有什么问题吗?

nlejzf6q

nlejzf6q1#

[^\d]要求有一个不是数字的字符。但是你说这个可以重复零次,当然当有两个以上的数字时,这也是正确的。您希望匹配^\d{2}$
(Also,[^\d]更好地写为\D。)
不过,在这里,数值比较可能比正则表达式好得多。请检查该数字是否小于100。

z9gpfhce

z9gpfhce2#

lambda m: '19'+m是错误的,因为mMatchData对象,而不是字符串。您可能已经尝试了m.group(),但是由于您还匹配数字两端的任何非数字字符(如空格),因此仍然可能得到错误的结果。
您可以使用

df['year'] = df['year'].str.strip().str.replace('^\d{2}$', r'19\g<0>')

备注:

  • 您需要使用str.strip()消除前导/尾随空格
  • 您需要将所有仅由2位数字组成的字符串与^\d{2}匹配
  • 替换是19和匹配值的串联(\g<0>是整个匹配反向引用)。
hsvhsicv

hsvhsicv3#

计数长度为2的字符串,并在其前面加上19:

df.assign(year = np.where(df.year.str.strip().str.len()==2,
                          '19'+df.year.str.strip(),
                           df.year))

    month   year
0   2   2001
1   5   1989
2   8   1999

相关问题