Фильтрация значений столбца DataFrame, которые не являются числовыми

Учитывать:

  1. У нас есть один DataFrame Pandas.
  2. Этот DataFrame имеет один столбец, который должен заполняться только числами с плавающей запятой.
  3. Однако тип данных — «объект», что означает, что там есть хотя бы одно нечисловое значение.
  4. Я хочу увидеть это/эти нечисловые значения, чтобы решить, что делать дальше.

Вопрос: как отфильтровать этот столбец так, чтобы возвращались только нечисловые ячейки?

Пример кода:

url = ('https://ml-repository-krakers.s3-eu-west-1.amazonaws.com/','kaggle+/churn_modelling/Telco-Customer-Churn.csv')
df = pd.read_csv(url)
df['TotalCharges'][ df['TotalCharges'] == ' ' ]

Как можно видеть, в наборе данных есть пробелы в столбце, который должен быть плавающим.

Обратите внимание, что в вопросе предполагается, что мы еще не знаем, что существуют только эти неплавающие значения. Мы не знаем, сколько и какие значения, не являющиеся плавающими, там находятся.

Укажите код, с которым вы сейчас работаете, который не работает. Мы можем решить вашу проблему. Однако не стоит ожидать, что мы напишем за вас весь код.

Luke L 11.08.2024 01:02

@LukeL Добавил код по запросу. Вопрос возник в известном наборе данных, в котором имеется точно такая же проблема, как описанная теоретически в разделе «Рассмотрение».

BsAxUbx5KoQDEpCAqSffwGy554PSah 11.08.2024 02:58

@user19077881 user19077881 Все значения будут возвращены вашей лямбда-функцией, поскольку весь столбец имеет тип «объект», как указано в пункте 3 раздела «Рассмотрение». Так что предложенное решение не работает.

BsAxUbx5KoQDEpCAqSffwGy554PSah 11.08.2024 03:01

В вашем первоначальном вопросе говорилось, что у вас есть значения с плавающей запятой, отсюда и мой подход .map(lambda .... Но ваш отредактированный вопрос и предоставленные данные показывают, что в столбце есть только строковые значения, некоторые из которых могут представлять собой числа с плавающей запятой. С этим разъяснением ответ будет следующим. Кстати, обратите внимание, что тип object может быть смешанным типом, а также строкой, поэтому мое первоначальное предложение сработало бы, если бы вы использовали смешанные типы с плавающей запятой и строки.

user19077881 11.08.2024 09:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш столбец TotalCharges состоит только из строк, некоторые из которых представляют собой числа с плавающей запятой. Поэтому вам нужно найти строки со значениями, которые не представляют собой числа с плавающей запятой.

Для этого вам необходимо сформировать маску, попытавшись преобразовать значения в числовые. В приведенном ниже коде to_numeric пытается это преобразование и из-за coerce выдает значения NaN там, где это невозможно. Маска формируется путем проверки этих значений Nan. Эту маску затем можно использовать для выбора только этих строк:

import pandas as pd

url = ('https://ml-repository-krakers.s3-eu-west-1.amazonaws.com/'
        'kaggle+/churn_modelling/Telco-Customer-Churn.csv')
df = pd.read_csv(url)


mask = pd.to_numeric(df['TotalCharges'], errors = 'coerce').isna()
df2 = df[mask]

print(df2)

дает:

      customerID  gender  SeniorCitizen  ... MonthlyCharges TotalCharges  Churn
488   4472-LVYGI  Female              0  ...          52.55                  No
753   3115-CZMZD    Male              0  ...          20.25                  No
936   5709-LVOEQ  Female              0  ...          80.85                  No
1082  4367-NUYAO    Male              0  ...          25.75                  No
1340  1371-DWPAZ  Female              0  ...          56.05                  No
3331  7644-OMVMY    Male              0  ...          19.85                  No
3826  3213-VVOLG    Male              0  ...          25.35                  No
4380  2520-SGTTA  Female              0  ...          20.00                  No
5218  2923-ARZLG    Male              0  ...          19.70                  No
6670  4075-WKNIU  Female              0  ...          73.35                  No
6754  2775-SEFEE    Male              0  ...          61.90                  No

[11 rows x 21 columns]

Другие вопросы по теме

Похожие вопросы