Операции Pandas между типами с плавающей запятой и NaN

Каковы причины того, что панды позволяют выполнять операции между наборами/строками/другими типами, отличными от числа с плавающей запятой, и NaN (что дает NaN), тогда как чистый Python этого не делает?

import pandas as pd
import numpy as np
pd.Series([np.nan]) - pd.Series([{5}]) # yields a NaN-series
pd.Series([np.nan]) - set([5]) # throws error "TypeError: unsupported operand type(s) for -: 'float' and 'set'"
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

NaN имеют особое значение в серии pandas. Они должны оставаться NaN в большинстве операций. Таким образом, последовательная работа обеспечивает удобство для некоторых типов.

Например, со строками:

pd.Series([np.nan, 'a', 'b']) + 'c'

0    NaN
1     ac
2     bc
dtype: object

Скорее всего, это реализовано, поскольку строковые операции довольно распространены. Операции набора просто не обрабатываются с нуля (они выполняются из-за отсутствия NaN: pd.Series([{4, 5}, {5}]) - set([5])), возможно, потому, что они представляют собой итерации, которые представляют собой особый тип данных и всегда сложно построить серию. В любом случае, вы должны иметь в виду, что операции string/set/python на самом деле не выполняются пандами векторно.

Одной из возможностей было бы удалить NaN, выполнить операцию установки, а затем восстановить NaN:

s = pd.Series([np.nan, {4, 5}, {5}])
s.dropna().sub({5}).reindex_like(s)

0    NaN
1    {4}
2     {}
dtype: object

Альтернативно, с помощью пользовательской функции:

s.map(lambda x: x if pd.isna(x) else x-{5})

0    NaN
1    {4}
2     {}
dtype: object

Но почему Python не дает также NaN? В чем причина запрета выполнения операции и возврата NaN?

silence_of_the_lambdas 04.09.2024 16:13

Поскольку наборы Python не предназначены для работы с NaN, то же самое происходит и со строками: np.nan + 'c'. Pandas делает это возможным для удобства.

mozway 04.09.2024 16:23

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

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

Используйте спецификатор формата для преобразования столбца float/int в фрейме данных Polars в строку
Как ВСТАВИТЬ в таблицу с помощью AUTO_INCREMENT?
Дилемма 100 заключенных: кодекс всегда приводит к провалу (все заключенные умирают)
Как устранить ошибку AttributeError: у модуля «Фиона» нет атрибута «Путь»?
Я работаю над тем, чтобы сделать бота Python, который будет нажимать кнопку в списке, который повторяется сам, используя селен
Какие замены регулярных выражений помогают при переписывании SQL-запросов MS Access как простых запросов TSQL? Как их можно зациклить с помощью Excel в качестве входных и выходных данных?
Сообщение об ошибке с использованием нескольких замен строк %s
Должны ли классы аутентификации и классы разрешений в представлениях Django REST Framework определяться с помощью списков или кортежей?
Есть ли сценарий, в котором `foo in list(bar)` нельзя заменить на `foo in bar`?
Выполняется ли простое задание в Python дважды?