Каковы причины того, что панды позволяют выполнять операции между наборами/строками/другими типами, отличными от числа с плавающей запятой, и 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.
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