Операции 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 поддерживает параллельное и асинхронное программирование с помощью модулей asyncio и multiprocessing.


1
50
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