Pandas строка соответствует отрицательному взгляду, не работает - PullRequest
2 голосов
/ 27 февраля 2020

Я хочу установить все значения в моем Pandas кадре данных, которые не соответствуют требуемому формату, в NaN.

Пример нежелательного формата:

Example of the undesired format

Код

df['Anfang L1'] = df['Anfang L1'].str.replace(r'(?!\D{3}.\d{2})', '')

Выражение регулярного выражения работает без отрицательного взгляда. Выражение регулярного выражения также работает с отрицательным прогнозом в функции 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)

Ответы [ 2 ]

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

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

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} - три не-ди git символа
    • \. - точка
    • \d{2} - две цифры
  • .* - все остальные строки.
1 голос
/ 27 февраля 2020

Проблема связана с определением регулярного выражения.

A Negative Lookahead A(?!B) предназначено для сопоставления всех A ', а не , за которыми следует 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
...