Spec-Zone.ru › pandas 1

Тип данных целочисленный с возможностью отсутствующего значения

Примечание

IntegerArray в настоящее время находится в экспериментальной стадии. Его API или реализация могут измениться без предупреждения.

Изменено в версии 1.0.0: Теперь используется pandas.NA в качестве отсутствующего значения вместо numpy.nan.

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

Создание

pandas может представлять целочисленные данные с возможными пропущенными значениями, используя arrays.IntegerArray. Это тип расширения, реализованный внутри pandas.

In [1]: arr = pd.array([1, 2, None], dtype=pd.Int64Dtype())

In [2]: arr
Out[2]: 
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64

Или строковый псевдоним "Int64" (обратите внимание на заглавную букву "I", чтобы отличить его от типа данных NumPy 'int64':

In [3]: pd.array([1, 2, np.nan], dtype="Int64")
Out[3]: 
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64

Все значения, подобные NA, заменяются на pandas.NA.

In [4]: pd.array([1, 2, np.nan, None, pd.NA], dtype="Int64")
Out[4]: 
<IntegerArray>
[1, 2, <NA>, <NA>, <NA>]
Length: 5, dtype: Int64

Этот массив можно хранить в DataFrame или Series как любой массив NumPy.

In [5]: pd.Series(arr)
Out[5]: 
0       1
1       2
2    <NA>
dtype: Int64

Также можно передать спископодобный объект в конструктор Series с типом данных.

Предупреждение

В настоящее время pandas.array() и pandas.Series() используют разные правила для вывода типа данных. pandas.array() будет выводить тип данных целочисленный с возможностью отсутствующего значения

In [6]: pd.array([1, None])
Out[6]: 
<IntegerArray>
[1, <NA>]
Length: 2, dtype: Int64

In [7]: pd.array([1, 2])
Out[7]: 
<IntegerArray>
[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]: 
<IntegerArray>
[1, <NA>]
Length: 2, dtype: Int64

In [11]: pd.Series([1, None], dtype="Int64")
Out[11]: 
0       1
1    <NA>
dtype: Int64

В будущем мы можем предоставить возможность Series выводить тип данных целочисленный с возможностью отсутствующего значения.

Операции

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

In [12]: s = pd.Series([1, 2, None], dtype="Int64")

# arithmetic
In [13]: s + 1
Out[13]: 
0       2
1       3
2    <NA>
dtype: Int64

# comparison
In [14]: s == 1
Out[14]: 
0     True
1    False
2     <NA>
dtype: boolean

# indexing
In [15]: s.iloc[1:3]
Out[15]: 
1       2
2    <NA>
dtype: Int64

# operate with other dtypes
In [16]: s + s.iloc[1:3].astype("Int8")
Out[16]: 
0    <NA>
1       4
2    <NA>
dtype: Int64

# coerce when needed
In [17]: s + 0.01
Out[17]: 
0    1.01
1    2.01
2    <NA>
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  <NA>  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

Операции агрегирования и группировки, такие как «сумма», также работают.

In [23]: df.sum()
Out[23]: 
A      3
B      5
C    aab
dtype: object

In [24]: df.groupby("B").A.sum()
Out[24]: 
B
1    3
3    0
Name: A, dtype: Int64

Скалярное значение NA

arrays.IntegerArray использует pandas.NA в качестве скалярного значения отсутствия данных. Вырезка отдельного элемента, который отсутствует, вернёт pandas.NA

In [25]: a = pd.array([1, None], dtype="Int64")

In [26]: a[1]
Out[26]: <NA>

© 2008–2022, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/1.5.0/user_guide/integer_na.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API