как удалить строки из фрейма данных, где поля содержат только тире / дефис (-), не влияя на отрицательные значения в python

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

У меня есть набор данных, содержащий, например:

 A      B     C
---- ----- -----
a      -     0
b      -16   2
c      -     2 
  

Я хочу удалить строки только с тире (-), ожидаемый результат:

 A   B   c
--- --- ---
a    nan  0
b    -16  2
c    nan  2
  

Комментарии:

1. Что вы пробовали? Что не сработало? Что вы получили? Чего вы ожидали? Что не работает с вашим кодом и где это?

2. Вы хотите игнорировать ----------------- строку?

3. Я только что отредактировал вопрос. Я хочу удалить строки с полями, содержащими (-).

4. @Toto Я устал использовать df1[df1.columns[1]].map(лямбда x:re.sub(«[^0-9.]»,»», x)) и метод replace, оба также изменяют отрицательные значения.

Ответ №1:

Это удаляет - только тогда, когда за ним не следует цифра:

 re.sub(r'-(?!d)', 'nan', s)
  

Комментарии:

1. Большое вам спасибо, это отлично сработало для моей проблемы.

2. единственная проблема в том, что когда число идет со знаком $ или%, этого регулярного выражения недостаточно.

3. @ann: Не могли бы вы привести несколько примеров с дополнительным знаком и ожидаемым результатом?

4. если есть какие-либо специальные символы только в поле, то его следует заменить на np.nan и любые специальные символы, связанные с числом, например: $ 40 следует читать как 40., 45% следует читать как 45.

5. @ann: Насколько я понимаю, вам нужно запустить 2 регулярных выражения, второе может быть: re.sub('[^d-] (d )D ', 1) оно удалит не цифру или точку перед числом и не цифру после числа ничем, сохранит только цифры. Скажите мне, работает ли это, и я добавлю в ответ.

Ответ №2:

Если вы используете pandas и numpy , вы можете сделать это с помощью.

 df = df.replace("-", np.nan)
  

Вывод:

 A    B    c

a    NaN  0
b    -16  2
c    NaN  2
  

Комментарии:

1. Спасибо. Это тоже работает, но для моего сценария я предпочел регулярное выражение.