В новата версия на Pandas от 29-ти януари 2020 г. са направени доста подобрения на библиотеката и са въведени редица нови възможности, които значително улесняват процеса на работа при анализ на данни с Python.
В тази статия ще ви запозная с някои от по-интересните нововъведения в Pandas 1.0, като ще видите с какво те могат да бъдат полезни и какви са разликите със старата версия.
Данните, използвани за примерите, които ще видите по-надолу в статията, са синтетични. Те съдържат 6 записа с информация за студенти, които на базата на определена оценка са преминали или не даден курс.
Липсващи стойности с pandas.NA
С версия 1.0 бе въведен нов начин за отбелязване на липсващи стойности. До преди това се използваше само np.nan за данни от тип float64 или object, np.NaT за DateTime и None за object. Целта на pandas.NA е да бъде индикатор за липсващи стойности независимо от типа на данните. Тъй като това е само експериментална фунционалност, е напълно възможно да настъпят редица изменения в следващи версии на Pandas.
Пример:
data = {'Student':['John Smith','Dave Willington', 'Caroline Reyes',
'Alexa Stone', 'Jessica Scott', 'Mikayla Jackson'],
'Grade': [3, 4, 6, pd.NA, 4, 5],
'Passed': [False, True, True, pd.NA, True, True]}
df = pd.DataFrame(data)
Резултат:
Student | Grade | Passed | |
---|---|---|---|
0 | John Smith | 3 | False |
1 | Dave Willington | 4 | True |
2 | Caroline Reyes | 6 | True |
3 | Alexa Stone | < NA > | < NA > |
4 | Jessica Scott | 4 | True |
5 | Mikayla Jackson | 5 | True |
Получават се различни резултати от аритметични операции при прилагане на pandas.NA за разлика от np.nan. За почти всяка от тях, полученият резултат е , докато при използване на np.nan е False или nan.
Няколко примера:
- Аритметични операции
np.nan > 1
Output:
False
pd.NA > 1
Output:
<NA>
np.nan + 1
Output:
nan
pd.NA + 1
Output:
<NA>
Изключения:
pd.NA ** 0
Output:
1
1 ** pd.NA
Output:
1
- Логически операции
pd.NA | True
Output:
True
pd.NA | False
Output:
False
Конвертиране към Markdown
Конвертирането на DataFrame структурата в Markdown таблица е едно полезно нововъведение, което предлага новата версия на Pandas. За тази цел е създаден методът to_markdown(). От него получаваме като резултат Markdown таблица във вид на низ. Това е полезно, когато искаме да представим таблица с данните в интернет.
Пример:
print(df.to_markdown())
Output:
| | Student | Grade | Passed |
|---:|:----------------|:--------|:---------|
| 0 | John Smith | 3 | False |
| 1 | Dave Willington | 4 | True |
| 2 | Caroline Reyes | 6 | True |
| 3 | Alexa Stone | <NA> | <NA> |
| 4 | Jessica Scott | 4 | True |
| 5 | Mikayla Jackson | 5 | True |
Въвеждането на to_markdown() значително улеснява работата на анализаторите. Липсата на този метод в старата версия е налагало например ръчно писане на Markdown таблиците, използване на някакъв онлайн инструмент за конвертиране, създаване на собствени функции или използване на модула tabulate.
Методът convert_dtypes()
Convert_dtypes() е създаден с цел да се насърчи използването на новите типове данни. Той преобразува всяка колона до най-подходящия тип, който поддържа новият индикатор за липсващи стойности – pandas.NA.
Пример:
df.dtypes
Output:
Student object
Grade float64
Passed object
dtype: object
df_new = df.convert_dtypes()
df_new.dtypes
Output:
Student string
Grade Int64
Passed boolean
dtype: object
String и Boolean типове
Въведени са 2 нови типа данни – string за текст и boolean за True/False стойности. Тъй като това са експериментални функционалности, Pandas не задава автоматично тези типове и все още определя нечисловите колони като object. Ако искаме изрично да зададем да бъдат string или boolean, трябва да го посочим явно. Полезността се проявява в това, че с въвеждането на тези типове се прави ясно разграничение на данните.
Пример:
df['Student'] = df['Student'].astype('string')
df['Passed'] = df['Passed'].astype('boolean')
df.info()
Output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Student 6 non-null string
1 Grade 5 non-null object
2 Passed 5 non-null boolean
dtypes: boolean(1), object(1), string(1)
memory usage: 236.0+ bytes
Някои подобрения на съществуващи методи
Методът select_dtypes() позволява отделяне на част от DataFrame на базата на типове колони. В новата версия на Pandas, този метод е направен да работи чрез векторизация вместо итерации на цикъл.
df_new.select_dtypes(include=['Int64','string'])
Резултат:
Student | Grade | |
---|---|---|
0 | John Smith | 3 |
1 | Dave Willington | 4 |
2 | Caroline Reyes | 6 |
3 | Alexa Stone | < NA > |
4 | Jessica Scott | 4 |
5 | Mikayla Jackson | 5 |
df_new.select_dtypes(exclude=['Int64','string'])
Резултат:
Passed | |
---|---|
0 | False |
1 | True |
2 | True |
3 | < NA > |
4 | True |
5 | True |
Методът info() дава възможност да видим основна информация за данните – колко е броят записи и колони, дали има липсващи стойности, какъв е типът на променливите и колко памет се използва. Това е изключително полезно, когато си опознаваме данните. В новата версия на Pandas в резултата от метода info() вече се показват и номерата на редовете.
Пример:
- Pandas 0.25.x
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
Student 6 non-null object
Grade 5 non-null float64
Passed 5 non-null object
dtypes: float64(1), object(2)
memory usage: 272.0+ bytes
- Pandas 1.0.0
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Student 6 non-null string
1 Grade 5 non-null object
2 Passed 5 non-null boolean
dtypes: boolean(1), object(1), string(1)
memory usage: 236.0+ bytes
Разгледаните нововъведения не се изчерпват до тук. Има още много подобрения на съществуващи методи, както и премахване на остарели такива, което значително подобрява работата с библиотеката. Можете да научите повече информация в официалната документация.
Искате да научите повече за машинното обучение?
Включете се в курса по машинно обучение и анализ на данни с Python.
Автор: Десислава Христова