Допускающий значения null целочисленный тип данных#
Примечание
IntegerArray в настоящее время является экспериментальным. Его API или реализация могут
измениться без предупреждения. Используется pandas.NA в качестве пропущенного значения.
В Работа с пропущенными данными, мы увидели, что pandas в основном использует NaN для представления пропущенных данных. Потому что NaN является числом с плавающей точкой, это заставляет массив целых чисел с любыми пропущенными значениями стать числом с плавающей точкой. В некоторых случаях это может не иметь большого значения. Но если ваш столбец целых чисел является, например, идентификатором, приведение к float может быть проблематичным. Некоторые целые числа даже не могут быть представлены как числа с плавающей точкой.
Создание#
pandas может представлять целочисленные данные с возможными пропущенными значениями, используя
arrays.IntegerArray. Это тип расширения
реализовано в pandas.
In [1]: arr = pd.array([1, 2, None], dtype=pd.Int64Dtype())
In [2]: arr
Out[2]:
[1, 2, ]
Length: 3, dtype: Int64
Или строковый псевдоним "Int64" (обратите внимание на заглавную "I") для отличия от NumPy 'int64' dtype:
In [3]: pd.array([1, 2, np.nan], dtype="Int64")
Out[3]:
[1, 2, ]
Length: 3, dtype: Int64
Все NA-подобные значения заменяются на pandas.NA.
In [4]: pd.array([1, 2, np.nan, None, pd.NA], dtype="Int64")
Out[4]:
[1, 2, , , ]
Length: 5, dtype: Int64
Этот массив может быть сохранен в DataFrame или Series как любой массив NumPy.
In [5]: pd.Series(arr)
Out[5]:
0 1
1 2
2
dtype: Int64
Вы также можете передать объект, подобный списку, в Series конструктор с указанием типа данных.
Предупреждение
В настоящее время pandas.array() и pandas.Series() использовать разные
правила для вывода типа данных. pandas.array() будет выводить тип данных nullable-integer
In [6]: pd.array([1, None])
Out[6]:
[1, ]
Length: 2, dtype: Int64
In [7]: pd.array([1, 2])
Out[7]:
[1, 2]
Length: 2, dtype: Int64
Для обратной совместимости, Series определяет их как целочисленный или вещественный тип данных.
In [8]: pd.Series([1, None])
Out[8]:
0 1.0
1 NaN
dtype: float64
In [9]: pd.Series([1, 2])
Out[9]:
0 1
1 2
dtype: int64
Мы рекомендуем явно указывать тип данных, чтобы избежать путаницы.
In [10]: pd.array([1, None], dtype="Int64")
Out[10]:
[1, ]
Length: 2, dtype: Int64
In [11]: pd.Series([1, None], dtype="Int64")
Out[11]:
0 1
1
dtype: Int64
В будущем мы можем предоставить опцию для Series для вывода
nullable-integer dtype.
Операции#
Операции с целочисленным массивом будут вести себя аналогично массивам NumPy. Пропущенные значения будут распространяться, и данные будут приведены к другому типу данных при необходимости.
In [12]: s = pd.Series([1, 2, None], dtype="Int64")
# arithmetic
In [13]: s + 1
Out[13]:
0 2
1 3
2
dtype: Int64
# comparison
In [14]: s == 1
Out[14]:
0 True
1 False
2
dtype: boolean
# slicing operation
In [15]: s.iloc[1:3]
Out[15]:
1 2
2
dtype: Int64
# operate with other dtypes
In [16]: s + s.iloc[1:3].astype("Int8")
Out[16]:
0
1 4
2
dtype: Int64
# coerce when needed
In [17]: s + 0.01
Out[17]:
0 1.01
1 2.01
2
dtype: Float64
Эти типы данных могут работать как часть DataFrame.
In [18]: df = pd.DataFrame({"A": s, "B": [1, 1, 3], "C": list("aab")})
In [19]: df
Out[19]:
A B C
0 1 1 a
1 2 1 a
2 3 b
In [20]: df.dtypes
Out[20]:
A Int64
B int64
C object
dtype: object
Эти типы данных можно объединять, изменять форму и преобразовывать.
In [21]: pd.concat([df[["A"]], df[["B", "C"]]], axis=1).dtypes
Out[21]:
A Int64
B int64
C object
dtype: object
In [22]: df["A"].astype(float)
Out[22]:
0 1.0
1 2.0
2 NaN
Name: A, dtype: float64
Операции редукции и группировки, такие как sum() также работают.
In [23]: df.sum(numeric_only=True)
Out[23]:
A 3
B 5
dtype: Int64
In [24]: df.sum()
Out[24]:
A 3
B 5
C aab
dtype: object
In [25]: df.groupby("B").A.sum()
Out[25]:
B
1 3
3 0
Name: A, dtype: Int64
Скалярное значение NA#
arrays.IntegerArray использует pandas.NA в качестве скалярного пропущенного значения. Срез одного элемента, который отсутствует, вернёт
pandas.NA
In [26]: a = pd.array([1, None], dtype="Int64")
In [27]: a[1]
Out[27]: