Получить не численные строки в столбце pandas python

Я проверил это сообщение: находить нечисловые строки в dataframe в pandas? но это действительно не отвечает на мой вопрос.

мои данные:

import pandas as pd


d = {
 'unit': ['UD', 'UD', 'UD', 'UD', 'UD','UD'],
 'N-D': [ 'Q1', 'Q2', 'Q3', 'Q4','Q5','Q6'],
 'num' : [ -1.48, 1.7, -6.18, 0.25, 'sum(d)', 0.25]

}
df = pd.DataFrame(d)

он выглядит так:

  N-D   num   unit
0  Q1  -1.48   UD
1  Q2   1.70   UD
2  Q3  -6.18   UD
3  Q4   0.25   UD
4  Q5   sum(d) UD
5  Q6   0.25   UD

Я хочу отфильтровать только строки в столбце 'num', которые не являются NUMERIC. Я хочу, чтобы все столбцы были только для строк, содержащих нечисловые значения для столбца 'num'.

желаемый результат:

  N-D   num   unit
4  Q5   sum(d) UD

мои попытки:

nonnumeric=df[~df.applymap(np.isreal).all(1)] #didn't work, it pulled out everything, besides i want the condition to check only column 'num'. 

nonnumeric=df['num'][~df.applymap(np.isreal).all(1)] #didn't work, it pulled out all the rows for column 'num' only.

Ответ 1

Используйте boolean indexing с маской, созданной to_numeric + isnull
Примечание. Это решение не находит или не фильтрует числа, сохраненные как строки: например, "1" или "22"

print (pd.to_numeric(df['num'], errors='coerce'))
0   -1.48
1    1.70
2   -6.18
3    0.25
4     NaN
5    0.25
Name: num, dtype: float64

print (pd.to_numeric(df['num'], errors='coerce').isnull())
0    False
1    False
2    False
3    False
4     True
5    False
Name: num, dtype: bool

print (df[pd.to_numeric(df['num'], errors='coerce').isnull()])
  N-D     num unit
4  Q5  sum(d)   UD

Другое решение с isinstance и apply:

print (df[df['num'].apply(lambda x: isinstance(x, str))])
  N-D     num unit
4  Q5  sum(d)   UD

Ответ 2

Предполагая, что это строки, вы можете фильтровать на основе соответствия регулярного выражения числа с плавающей запятой.

df[~df.num.str.match('^\-?(\d*\.?\d+|\d+\.?\d*)$')]

  N-D     num unit
4  Q5  sum(d)   UD

Ответ 3

Я использовал

df = df[df['num'].apply(lambda x: type(x) == str)]

и теперь df есть

  N-D     num unit
4  Q5  sum(d)   UD