Как проверить, что поле фрейма данных pandas является цифрой и не является пустым?

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий фрейм данных df :

 col1   col2   col3
50     dd     3
2      r      NaN
5      d      4
a      e      5
  

Мне нужно вычислить среднее значение для выбранных столбцов cols . И затем я должен проверить, не отклоняется ли какое-либо из значений в выбранных строках от среднего значения более чем на 20%.

Я не уверен, как использовать смешанные значения в одной строке для выполнения этих вычислений.

 def test_row(x, threshold):
    if x.dtype == int or x.dtype == float:
        return x > threshold

columns = ["col1", "col3"]
for col in columns:
    threshold = df[col].median()*(20/100)
    check = df.apply(lambda x: test_row(x[col], threshold), axis=1)
    print(check.any())
  

Однако это, очевидно, завершается неудачей, потому что if x.dtype == int or x.dtype == float не работает.

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

1. ваш код выдает ошибку значения здесь: threshold = df[col].median()*(20/100) еще до запуска функции

2. Спасибо @Chris. Вы знаете, как это исправить? Я не хочу заменять NaN на 0. Просто чтобы пропустить их.

3. Проблема, о которой сообщил @ Chris, заключается в том, что в col1 есть ‘a’. Вы можете исправить изменение столбца типа, используя pd.to_numeric(df['col1'], errors='coerce')

4. @Terry. Будет ли этот код просто возвращать все числовые значения?

5. он преобразует в числовое значение, то, что он не может преобразовать, вернет как NaN

Ответ №1:

Ваша функция может быть:

 def test_row(x, threshold):
    if isinstance(x,(int,float)) and x:
        return x > threshold
  

Вторая логика в функции предназначена только для проверки, содержит ли x что-либо, если оно пустое, оно вернет False.