В конце января 2020 вышло большое обновление библиотеки pandas – 1.0. Представляем вам обзор изменений и дополнений, которые по нашему мнению являются интересными и заслуживают внимания.
- pd.NA
- Типы pandas для работы со строками и boolean-значениями
- Инструмент конвертирования типов
- Конвертор в markdown
- Еще изменения и дополнения…
Мажорный релиз 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”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.