Получить не численные строки в столбце 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