Что нового в pandas 1.0?

В конце января 2020 вышло большое обновление библиотеки pandas – 1.0. Представляем вам обзор изменений и дополнений, которые по нашему мнению являются интересными и заслуживают внимания.

Мажорный релиз 1.0 принес с собой улучшения существующих инструментов, новые дополнения (они пока имеют статус экспериментальных), ряд изменений в API, которые ломают обратную совместимость, багфиксы и изменения, увеличивающие производительность библиотеки.

pd.NA

Первое, с чего хотелось бы начать – это pd.NA – “значение”, которое pandas будет использовать для обозначения отсутствующих данных. 

В предыдущих версиях pandas для обозначения отсутствующих данных использовались следующие значения: NaN, NaT и None. NaN – это отсутствующее значение в столбце с числовым типом данных, оно является аббревиатурой от Not a Number (пришло из numpy: np.NaN). NaT – это отсутствующее значение для данных типа DateTime, аббревиатура от Not a Time (является частью библиотеки pandas). None используется если тип данных object, такой тип имеют, например, элементы типа str (пришло из Python).

Рассмотрим работу с отсутствующими данными на примерах:

> d = {"A":[None, "test2", "test3"], "B": [1.01, np.nan, 3.45], "C": [date(2019, 1, 29), datetime.now(), None], "D":[1, 2, None]}
> df = pd.DataFrame(d)

Если создать набор данных с целыми числами, не указывая явно тип, то будет использовано значение по умолчанию:

> pd.Series([4, 5, None])
0    4.0
1    5.0
2    NaN
dtype: float64

Если тип указать, то в pandas 1.0 будет использован pd.NA:

>pd.Series([4, 5, None], dtype="Int64")
0       4
1       5
2    <NA>
dtype: Int64

Либо можно задать pd.NA напрямую:

> pd.Series([4, 5, pd.NA], dtype="Int64")
0       4
1       5
2    <NA>
dtype: Int64

Для строковых и boolean значений это работает аналогично:

> pd.Series([None, "test2", "test3"])
0     None
1    test2
2    test3
dtype: object

> pd.Series([None, "test2", "test3"], dtype='string')
0     <NA>
1    test2
2    test3
dtype: string

> pd.Series([True, False, None])
0     True
1    False
2     None
dtype: object

> pd.Series([True, False, None], dtype='boolean')
0     True
1    False
2     <NA>
dtype: boolean

Типы pandas для работы со строками и boolean-значениями

Появился тип StringDtype для работы со строковыми данными (до этого строки хранились в  object-dtype NumPy массивах). При создании структуры pandas необходимо указать тип StringDtype либо string:

> pd.Series([None, "test2", "test3"], dtype=pd.StringDtype())
0     <NA>
1    test2
2    test3
dtype: string

> pd.Series([None, "test2", "test3"], dtype='string')
0     <NA>
1    test2
2    test3
dtype: string

Также добавлен тип  BooleanDtype для хранения boolean значений. В предыдущих версиях столбец данных типа bool не мог содержать отсутствующие значения, тип BooleanDtype поддерживает эту возможность:

> pd.Series([False, True, None], dtype=pd.BooleanDtype())
0    False
1     True
2     <NA>
dtype: boolean

> pd.Series([False, True, None], dtype='boolean')
0    False
1     True
2     <NA>
dtype: boolean

Инструмент конвертирования типов

Метод convert_dtypes поддерживает работу с новыми типами:

> d = {"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]}
> df = pd.DataFrame(d)
> df_conv = df.convert_dtypes()
> df

> df_conv

> df.dtypes
A     object
B    float64
C     object
D    float64
dtype: object

> df_conv.dtypes
A     string
B      Int64
C    boolean
D      Int64
dtype: object

Конвертор в markdown

В pandas 1.0 добавлен метод to_markdown() для конвертирования структур pandas в markdown таблицы:

> d = {"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]}
> df = pd.DataFrame(d)
> print(df.to_markdown())
|    | A   | B | C     | D |
|---:|:------|----:|:------|----:|
|  0 |       | 1 | True  | 1 |
|  1 | test2 | nan | False |   2 |
|  2 | test3 |   3 | | nan |

> s = pd.Series([None, "test2", "test3"], dtype='string')
> print(s.to_markdown())
|    | 0   |
|---:|:------|
|  0 | <NA>  |
|  1 | test2 |
|  2 | test3 |

Еще изменения и дополнения…

  • Ускорение работы функций  rolling.apply и expanding.apply;
  • Возможность игнорирования индекса при сортировке DataFrame:
> df = pd.DataFrame({"A": [8,7,3,2]})
> df

> df.sort_values("A")

> df.sort_values("A", ignore_index=True)

  • Более информативный info()
> d = {"A":[None, "test2", "test3"], "B": [1, np.nan, 3], "C": [True, False, None], "D":[1, 2, None]}
> df = pd.DataFrame(d).convert_dtypes()
> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A     2 non-null      string 
 1   B     2 non-null      Int64  
 2   C     2 non-null      boolean
 3   D     2 non-null      Int64  
dtypes: Int64(2), boolean(1), string(1)
memory usage: 212.0 bytes

Более подробно про остальные изменения и дополнения можете прочитать на официальной странице сайта pandas.

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта. Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Книга: Линейная алгебра на Python
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas.  Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *