Добавить префикс в строки, соответствующие заданному шаблону c - PullRequest
0 голосов
/ 27 января 2020

На основе 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

Я хочу префикс всех экземпляров года, состоящих только из 2 цифр, на 19, так что результирующий 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

Что не работает. В чем проблема?

Ответы [ 3 ]

1 голос
/ 27 января 2020

lambda m: '19'+m неверно, потому что m является MatchData объектом, а не строкой. Возможно, вы пробовали m.group(), но, поскольку вы также сопоставляете любые символы, отличные от git на обоих концах числа (в виде пробела), вы все равно можете получить неправильные результаты.

Вы можете использовать

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

ПРИМЕЧАНИЯ:

  • Вам нужно избавиться от начальных / конечных пробелов с помощью str.strip()
  • Вам нужно сопоставить все строки, состоящие всего из 2 цифр, с ^\d{2}
  • Замена представляет собой конкатенацию 19 и значение совпадения (\g<0> - обратная ссылка всего совпадения).
1 голос
/ 27 января 2020

[^\d] требует наличия символа, который не является ди git. Но затем вы говорите, что это может быть повторено ноль раз, что, конечно, тоже тривиально, когда есть более двух цифр. Вместо этого вы хотите сопоставить ^\d{2}$.

(Кроме того, [^\d] лучше писать \D.)

Сравнение чисел c, вероятно, намного лучше, чем регулярное выражение, хоть. Просто проверьте, меньше ли число, чем 100.

0 голосов
/ 27 января 2020

IIU C, считайте строки, длина которых равна двум, и начинайте с префикса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...