HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>20 июл 2023</li>
2 <ul><li>20 июл 2023</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Исчерпывающий гайд по самому популярному фреймворку в ML от эксперта по data science и машинному обучению.</p>
4 </ul><p>Исчерпывающий гайд по самому популярному фреймворку в ML от эксперта по data science и машинному обучению.</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6 <p>Журналист, редактор. Фанат виртуальности во всех её видах - потому о ней и пишет.</p>
6 <p>Журналист, редактор. Фанат виртуальности во всех её видах - потому о ней и пишет.</p>
7 <p><strong>Об авторе</strong></p>
7 <p><strong>Об авторе</strong></p>
8 <p>Ph. d. в области машиностроения, доцент<a>Нишского университета</a>. Основная специализация: гибридные методы оптимизации и машинное обучение в энергетике. Владеет несколькими языками программирования, среди которых Python, C#, C и JavaScript.</p>
8 <p>Ph. d. в области машиностроения, доцент<a>Нишского университета</a>. Основная специализация: гибридные методы оптимизации и машинное обучение в энергетике. Владеет несколькими языками программирования, среди которых Python, C#, C и JavaScript.</p>
9 <p><a>Pandas DataFrame</a>активно применяют в data science, машинном обучении, научных вычислениях и многих других областях, связанных с активным использованием данных.</p>
9 <p><a>Pandas DataFrame</a>активно применяют в data science, машинном обучении, научных вычислениях и многих других областях, связанных с активным использованием данных.</p>
10 <p>Эти структуры во многом похожи на SQL, таблицы Excel и Calc. Однако зачастую DataFrame быстрее, проще в использовании и мощнее - ведь это неотъемлемая часть экосистемы<a>Python</a>и NumPy.</p>
10 <p>Эти структуры во многом похожи на SQL, таблицы Excel и Calc. Однако зачастую DataFrame быстрее, проще в использовании и мощнее - ведь это неотъемлемая часть экосистемы<a>Python</a>и NumPy.</p>
11 <p>Из этой статьи вы узнаете:</p>
11 <p>Из этой статьи вы узнаете:</p>
12 <ul><li>Что такое<strong>DataFrame</strong>в Pandas<strong></strong>и как его создать.</li>
12 <ul><li>Что такое<strong>DataFrame</strong>в Pandas<strong></strong>и как его создать.</li>
13 <li>Как<strong>получить доступ, изменить, добавить, отсортировать, отфильтровать и удалить</strong>данные.</li>
13 <li>Как<strong>получить доступ, изменить, добавить, отсортировать, отфильтровать и удалить</strong>данные.</li>
14 <li>Как обрабатывать<strong>пропущенные значения</strong>.</li>
14 <li>Как обрабатывать<strong>пропущенные значения</strong>.</li>
15 <li>Как работать с <strong>временными рядами</strong>.</li>
15 <li>Как работать с <strong>временными рядами</strong>.</li>
16 <li>Как быстро<strong>визуализировать</strong>данные.</li>
16 <li>Как быстро<strong>визуализировать</strong>данные.</li>
17 </ul><ul><li><a>Что такое Pandas DataFrame</a></li>
17 </ul><ul><li><a>Что такое Pandas DataFrame</a></li>
18 <li><a>Создание Pandas DataFrame</a></li>
18 <li><a>Создание Pandas DataFrame</a></li>
19 </ul><ul><li><a>Создание из словарей</a></li>
19 </ul><ul><li><a>Создание из словарей</a></li>
20 <li><a>Создание из списков</a></li>
20 <li><a>Создание из списков</a></li>
21 <li><a>Создание из массивов NumPy</a></li>
21 <li><a>Создание из массивов NumPy</a></li>
22 <li><a>Создание из файлов</a></li>
22 <li><a>Создание из файлов</a></li>
23 </ul><ul><li><a>Получение меток и данных</a></li>
23 </ul><ul><li><a>Получение меток и данных</a></li>
24 </ul><ul><li><a>Метки Pandas DataFrame как последовательность</a></li>
24 </ul><ul><li><a>Метки Pandas DataFrame как последовательность</a></li>
25 <li><a>Данные в виде массивов NumPy</a></li>
25 <li><a>Данные в виде массивов NumPy</a></li>
26 <li><a>Типы данных</a></li>
26 <li><a>Типы данных</a></li>
27 <li><a>Размер Pandas DataFrame</a></li>
27 <li><a>Размер Pandas DataFrame</a></li>
28 </ul><ul><li><a>Получение доступа и изменение данных</a></li>
28 </ul><ul><li><a>Получение доступа и изменение данных</a></li>
29 </ul><ul><li><a>Получение данных с помощью аксессоров</a></li>
29 </ul><ul><li><a>Получение данных с помощью аксессоров</a></li>
30 <li><a>Установка данных с помощью аксессоров</a></li>
30 <li><a>Установка данных с помощью аксессоров</a></li>
31 </ul><ul><li><a>Вставка и удаление данных</a></li>
31 </ul><ul><li><a>Вставка и удаление данных</a></li>
32 </ul><ul><li><a>Вставка и удаление строк</a></li>
32 </ul><ul><li><a>Вставка и удаление строк</a></li>
33 <li><a>Вставка и удаление столбцов</a></li>
33 <li><a>Вставка и удаление столбцов</a></li>
34 </ul><ul><li><a>Применение арифметических операций</a></li>
34 </ul><ul><li><a>Применение арифметических операций</a></li>
35 <li><a>Применение функций NumPy и SciPy</a></li>
35 <li><a>Применение функций NumPy и SciPy</a></li>
36 <li><a>Сортировка в Pandas DataFrame</a></li>
36 <li><a>Сортировка в Pandas DataFrame</a></li>
37 <li><a>Фильтрация данных</a></li>
37 <li><a>Фильтрация данных</a></li>
38 <li><a>Работа со статистическими данными</a></li>
38 <li><a>Работа со статистическими данными</a></li>
39 <li><a>Обработка отсутствующих данных</a></li>
39 <li><a>Обработка отсутствующих данных</a></li>
40 </ul><ul><li><a>Расчёт с отсутствующими данными</a></li>
40 </ul><ul><li><a>Расчёт с отсутствующими данными</a></li>
41 <li><a>Заполнение недостающих данных</a></li>
41 <li><a>Заполнение недостающих данных</a></li>
42 <li><a>Удаление строк и столбцов с отсутствующими данными</a></li>
42 <li><a>Удаление строк и столбцов с отсутствующими данными</a></li>
43 </ul><ul><li><a>Итерации в Pandas DataFrame</a></li>
43 </ul><ul><li><a>Итерации в Pandas DataFrame</a></li>
44 <li><a>Работа с временными рядами</a></li>
44 <li><a>Работа с временными рядами</a></li>
45 </ul><ul><li><a>Создание DataFrame с метками временных рядов</a></li>
45 </ul><ul><li><a>Создание DataFrame с метками временных рядов</a></li>
46 <li><a>Индексирование и нарезка</a></li>
46 <li><a>Индексирование и нарезка</a></li>
47 <li><a>Ресемплинг и роллинг</a></li>
47 <li><a>Ресемплинг и роллинг</a></li>
48 </ul><ul><li><a>Графика в Pandas DataFrame</a></li>
48 </ul><ul><li><a>Графика в Pandas DataFrame</a></li>
49 <li><a>Рекомендуемая литература</a></li>
49 <li><a>Рекомендуемая литература</a></li>
50 <li><a>Заключение</a></li>
50 <li><a>Заключение</a></li>
51 </ul><p>Pandas DataFrame (или просто дата фреймы) - это структуры, которые состоят из:</p>
51 </ul><p>Pandas DataFrame (или просто дата фреймы) - это структуры, которые состоят из:</p>
52 <ul><li><strong>данных</strong>, организованных в двух измерениях - строках и столбцах;</li>
52 <ul><li><strong>данных</strong>, организованных в двух измерениях - строках и столбцах;</li>
53 <li>и соответствующих этим строкам и столбцам<strong>меток</strong>.</li>
53 <li>и соответствующих этим строкам и столбцам<strong>меток</strong>.</li>
54 </ul><p>Мы будем писать код в интерактивной консоли Python. Чтобы начать работу с Pandas, нужно импортировать её модуль:</p>
54 </ul><p>Мы будем писать код в интерактивной консоли Python. Чтобы начать работу с Pandas, нужно импортировать её модуль:</p>
55 &gt;&gt;&gt; import pandas as pd<p>Если в вашем окружении нет библиотеки Pandas,<a>установите её</a>с помощью пакетного менеджера PIP.</p>
55 &gt;&gt;&gt; import pandas as pd<p>Если в вашем окружении нет библиотеки Pandas,<a>установите её</a>с помощью пакетного менеджера PIP.</p>
56 <p>Сразу приступим к практике. Представьте такую ситуацию: наша компания ищет Python-разработчиков в новую команду. Кандидатов так много, что отбирать их вручную, было бы слишком долго, поэтому нас попросили написать программу для анализа результатов тестирования.</p>
56 <p>Сразу приступим к практике. Представьте такую ситуацию: наша компания ищет Python-разработчиков в новую команду. Кандидатов так много, что отбирать их вручную, было бы слишком долго, поэтому нас попросили написать программу для анализа результатов тестирования.</p>
57 <p>Нас интересуют имена кандидатов (<strong>name</strong>), города проживания (<strong>city</strong>), возраст (<strong>age</strong>) и количество баллов, которое они получили в тесте по программированию (<strong>py-score</strong>):</p>
57 <p>Нас интересуют имена кандидатов (<strong>name</strong>), города проживания (<strong>city</strong>), возраст (<strong>age</strong>) и количество баллов, которое они получили в тесте по программированию (<strong>py-score</strong>):</p>
58 namecityage<strong>py-score</strong>101XavierMexico City4188.0102AnnToronto2879.0103JanaPrague3381.0104YiShanghai3480.0105RobinManchester3868.0106AmalCairo3161.0107NoriOsaka3784.0<p>В этой таблице первая строка содержит<strong>метки столбцов</strong>(name, city и так далее). Первый столбец содержит метки строк (101, 102 и так далее). Все остальные ячейки заполняются значениями данных.</p>
58 namecityage<strong>py-score</strong>101XavierMexico City4188.0102AnnToronto2879.0103JanaPrague3381.0104YiShanghai3480.0105RobinManchester3868.0106AmalCairo3161.0107NoriOsaka3784.0<p>В этой таблице первая строка содержит<strong>метки столбцов</strong>(name, city и так далее). Первый столбец содержит метки строк (101, 102 и так далее). Все остальные ячейки заполняются значениями данных.</p>
59 <p>Есть несколько способов создать data frame. В большинстве случаев используют конструктор и передают данные в виде двумерного списка, кортежа или массива<a>NumPy</a>. Также их можно переформатировать в словарь, Pandas Series или другие типы данных, которые в этой статье не рассматриваются.</p>
59 <p>Есть несколько способов создать data frame. В большинстве случаев используют конструктор и передают данные в виде двумерного списка, кортежа или массива<a>NumPy</a>. Также их можно переформатировать в словарь, Pandas Series или другие типы данных, которые в этой статье не рассматриваются.</p>
60 <p>Предположим, нам нужен словарь:</p>
60 <p>Предположим, нам нужен словарь:</p>
61 &gt;&gt;&gt; data = { ... 'name': ['Xavier', 'Ann', 'Jana', 'Yi', 'Robin', 'Amal', 'Nori'], ... 'city': ['Mexico City', 'Toronto', 'Prague', 'Shanghai', ... 'Manchester', 'Cairo', 'Osaka'], ... 'age': [41, 28, 33, 34, 38, 31, 37], ... 'py-score': [88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0] ... } &gt;&gt;&gt; row_labels = [101, 102, 103, 104, 105, 106, 107]<p>В данном случае data- это<a>переменная Python</a>, которая ссылается на словарь, содержащий данные кандидатов. Она содержит метки столбцов:</p>
61 &gt;&gt;&gt; data = { ... 'name': ['Xavier', 'Ann', 'Jana', 'Yi', 'Robin', 'Amal', 'Nori'], ... 'city': ['Mexico City', 'Toronto', 'Prague', 'Shanghai', ... 'Manchester', 'Cairo', 'Osaka'], ... 'age': [41, 28, 33, 34, 38, 31, 37], ... 'py-score': [88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0] ... } &gt;&gt;&gt; row_labels = [101, 102, 103, 104, 105, 106, 107]<p>В данном случае data- это<a>переменная Python</a>, которая ссылается на словарь, содержащий данные кандидатов. Она содержит метки столбцов:</p>
62 <ul><li>'name'</li>
62 <ul><li>'name'</li>
63 <li>'city'</li>
63 <li>'city'</li>
64 <li>'age'</li>
64 <li>'age'</li>
65 <li>'py-score'</li>
65 <li>'py-score'</li>
66 </ul><p>А row_labels ссылается на список, содержащий метки строк, представляющих собой числа в диапазоне от 101 до 107.</p>
66 </ul><p>А row_labels ссылается на список, содержащий метки строк, представляющих собой числа в диапазоне от 101 до 107.</p>
67 <p>Создадим Pandas DataFrame:</p>
67 <p>Создадим Pandas DataFrame:</p>
68 &gt;&gt;&gt; df = pd.DataFrame(data=data, index=row_labels) &gt;&gt;&gt; df name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0 103 Jana Prague 33 81.0 104 Yi Shanghai 34 80.0 105 Robin Manchester 38 68.0 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p>Здесь df - это переменная, содержащая ссылку на наш объект DataFrame. Он выглядит точно так же, как и приведённая выше таблица кандидатов, и имеет следующие функции:</p>
68 &gt;&gt;&gt; df = pd.DataFrame(data=data, index=row_labels) &gt;&gt;&gt; df name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0 103 Jana Prague 33 81.0 104 Yi Shanghai 34 80.0 105 Robin Manchester 38 68.0 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p>Здесь df - это переменная, содержащая ссылку на наш объект DataFrame. Он выглядит точно так же, как и приведённая выше таблица кандидатов, и имеет следующие функции:</p>
69 <ul><li>Метки строк от 101 до 107;</li>
69 <ul><li>Метки строк от 101 до 107;</li>
70 <li>Метки столбцов 'name', 'city', 'age' и 'py-score';</li>
70 <li>Метки столбцов 'name', 'city', 'age' и 'py-score';</li>
71 <li>Данные: имена кандидатов, города, возраст и результаты тестов Python.</li>
71 <li>Данные: имена кандидатов, города, возраст и результаты тестов Python.</li>
72 </ul><p>В таблице представлены метки и данные из df: красные - метки столбцов, синие - метки строк, зелёные - данные.</p>
72 </ul><p>В таблице представлены метки и данные из df: красные - метки столбцов, синие - метки строк, зелёные - данные.</p>
73 0namecityage<strong>py-score</strong>101XavierMexico City4188.0102AnnToronto2879.0103JanaPrague3381.0104YiShanghai3480.0105RobinManchester3868.0106AmalCairo3161.0107NoriOsaka3784.0<p>Иногда объекты Pandas DataFrames настолько большие, что просматривать все строки одновременно становится неудобно. Чтобы увидеть первые несколько элементов, воспользуйтесь методом<a>head()</a>, а для показа последних -<a>tail()</a>. С помощью необязательного параметра n в скобках можно регулировать количество строк, которое вы хотите отобразить:</p>
73 0namecityage<strong>py-score</strong>101XavierMexico City4188.0102AnnToronto2879.0103JanaPrague3381.0104YiShanghai3480.0105RobinManchester3868.0106AmalCairo3161.0107NoriOsaka3784.0<p>Иногда объекты Pandas DataFrames настолько большие, что просматривать все строки одновременно становится неудобно. Чтобы увидеть первые несколько элементов, воспользуйтесь методом<a>head()</a>, а для показа последних -<a>tail()</a>. С помощью необязательного параметра n в скобках можно регулировать количество строк, которое вы хотите отобразить:</p>
74 &gt;&gt;&gt; df.head(n=2) name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0&gt;&gt;&gt; df.tail(n=2) name city age py-score 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p><strong>Примечание.</strong>В зависимости от ситуации Pandas DataFrame можно рассматривать как словарь столбцов или как Pandas Series с дополнительными функциями.</p>
74 &gt;&gt;&gt; df.head(n=2) name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0&gt;&gt;&gt; df.tail(n=2) name city age py-score 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p><strong>Примечание.</strong>В зависимости от ситуации Pandas DataFrame можно рассматривать как словарь столбцов или как Pandas Series с дополнительными функциями.</p>
75 <p>Доступ к столбцам в Pandas DataFrame можно получить так же, как к значениям из словаря, - это самый удобный способ:</p>
75 <p>Доступ к столбцам в Pandas DataFrame можно получить так же, как к значениям из словаря, - это самый удобный способ:</p>
76 &gt;&gt;&gt; cities = df['city'] &gt;&gt;&gt; cities 101 Mexico City 102 Toronto 103 Prague 104 Shanghai 105 Manchester 106 Cairo 107 Osaka Name: city, dtype: object<p>Если имя столбца - строка, представленная в виде<a>действительного идентификатора Python</a>, для доступа к нему можно также использовать запись через точку, то есть тем же путём, как и для атрибута экземпляра класса. Попробуем извлечь таким способом всё тот же столбец с меткой 'city', содержащей данные о местонахождении наших кандидатов:</p>
76 &gt;&gt;&gt; cities = df['city'] &gt;&gt;&gt; cities 101 Mexico City 102 Toronto 103 Prague 104 Shanghai 105 Manchester 106 Cairo 107 Osaka Name: city, dtype: object<p>Если имя столбца - строка, представленная в виде<a>действительного идентификатора Python</a>, для доступа к нему можно также использовать запись через точку, то есть тем же путём, как и для атрибута экземпляра класса. Попробуем извлечь таким способом всё тот же столбец с меткой 'city', содержащей данные о местонахождении наших кандидатов:</p>
77 &gt;&gt;&gt; df.city 101 Mexico City 102 Toronto 103 Prague 104 Shanghai 105 Manchester 106 Cairo 107 Osaka Name: city, dtype: object<p>Обратите внимание: мы извлекли как данные, так и соответствующие метки строк:</p>
77 &gt;&gt;&gt; df.city 101 Mexico City 102 Toronto 103 Prague 104 Shanghai 105 Manchester 106 Cairo 107 Osaka Name: city, dtype: object<p>Обратите внимание: мы извлекли как данные, так и соответствующие метки строк:</p>
78 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Каждый столбец Pandas DataFrame - это экземпляр класса<a>Pandas.Series</a> - структуры, которая содержит одномерные данные и их метки. Вызвать любой элемент из объектов<strong>Series</strong>можно так же, как из словаря, то есть используя его метку в качестве ключа:</p>
78 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Каждый столбец Pandas DataFrame - это экземпляр класса<a>Pandas.Series</a> - структуры, которая содержит одномерные данные и их метки. Вызвать любой элемент из объектов<strong>Series</strong>можно так же, как из словаря, то есть используя его метку в качестве ключа:</p>
79 &gt;&gt;&gt; cities[102] 'Toronto'<p>В данном случае 'Toronto' - это значение данных, а 102 - соответствующая метка. В <a>следующем разделе</a>приведены другие способы вызвать элемент Pandas DataFrame.</p>
79 &gt;&gt;&gt; cities[102] 'Toronto'<p>В данном случае 'Toronto' - это значение данных, а 102 - соответствующая метка. В <a>следующем разделе</a>приведены другие способы вызвать элемент Pandas DataFrame.</p>
80 <p>Доступ ко всей строке можно получить с помощью аксессора<a>.loc[]</a>:</p>
80 <p>Доступ ко всей строке можно получить с помощью аксессора<a>.loc[]</a>:</p>
81 &gt;&gt;&gt; df.loc[103] name Jana city Prague age 33 py-score 81.0 Name: 103, dtype: object<p>На этот раз мы извлекли строку, соответствующую метке 103, содержащую данные кандидатки по имени Jana. Кроме самих значений данных мы видим и метки соответствующих столбцов:</p>
81 &gt;&gt;&gt; df.loc[103] name Jana city Prague age 33 py-score 81.0 Name: 103, dtype: object<p>На этот раз мы извлекли строку, соответствующую метке 103, содержащую данные кандидатки по имени Jana. Кроме самих значений данных мы видим и метки соответствующих столбцов:</p>
82 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Возвращаемая строка - тоже экземпляр Pandas.Series.</p>
82 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Возвращаемая строка - тоже экземпляр Pandas.Series.</p>
83 <p>Как уже упоминалось, существует несколько способов создать дата фрейм. В этом разделе вы научитесь делать это с помощью конструктора DataFrame, используя:</p>
83 <p>Как уже упоминалось, существует несколько способов создать дата фрейм. В этом разделе вы научитесь делать это с помощью конструктора DataFrame, используя:</p>
84 <ul><li>словари Python;</li>
84 <ul><li>словари Python;</li>
85 <li>списки Python;</li>
85 <li>списки Python;</li>
86 <li>двумерные массивы NumPy;</li>
86 <li>двумерные массивы NumPy;</li>
87 <li>файлы.</li>
87 <li>файлы.</li>
88 </ul><p>Есть и другие методы, о которых вы можете узнать из <a>официальной документации</a>.</p>
88 </ul><p>Есть и другие методы, о которых вы можете узнать из <a>официальной документации</a>.</p>
89 <p>Начнём с импорта NumPy, который пригодится нам дальше:</p>
89 <p>Начнём с импорта NumPy, который пригодится нам дальше:</p>
90 &gt;&gt;&gt; import numpy as np &gt;&gt;&gt; import Pandas as pd<p>Вот и всё. Теперь создадим несколько видов DataFrame.</p>
90 &gt;&gt;&gt; import numpy as np &gt;&gt;&gt; import Pandas as pd<p>Вот и всё. Теперь создадим несколько видов DataFrame.</p>
91 <p>Как вы уже знаете, Pandas DataFrame можно создать из словаря Python:</p>
91 <p>Как вы уже знаете, Pandas DataFrame можно создать из словаря Python:</p>
92 &gt;&gt;&gt; d = {'x': [1, 2, 3], 'y': np.array([2, 4, 8]), 'z': 100} &gt;&gt;&gt; pd.DataFrame(d) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Ключи словаря - это метки столбцов DataFrame, а значения словаря - это значения данных в соответствующих столбцах DataFrame. Они могут содержаться в <a>кортеже</a>,<a>списке</a>, одномерном<a>массиве NumPy</a>,<a>объекте Pandas Series</a>или в одном из нескольких других типов данных. Можно также указать значение, которое будет скопировано по всему столбцу.</p>
92 &gt;&gt;&gt; d = {'x': [1, 2, 3], 'y': np.array([2, 4, 8]), 'z': 100} &gt;&gt;&gt; pd.DataFrame(d) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Ключи словаря - это метки столбцов DataFrame, а значения словаря - это значения данных в соответствующих столбцах DataFrame. Они могут содержаться в <a>кортеже</a>,<a>списке</a>, одномерном<a>массиве NumPy</a>,<a>объекте Pandas Series</a>или в одном из нескольких других типов данных. Можно также указать значение, которое будет скопировано по всему столбцу.</p>
93 <p>Можно менять порядок столбцов с помощью параметра columns, а меток строк - с помощью index:</p>
93 <p>Можно менять порядок столбцов с помощью параметра columns, а меток строк - с помощью index:</p>
94 &gt;&gt;&gt; pd.DataFrame(d, index=[100, 200, 300], columns=['z', 'y', 'x']) z y x 100 100 2 1 200 100 4 2 300 100 8 3<p>Как видите, мы указали метки строк 100, 200 и 300, при этом изменив порядок столбцов: z, y, x.</p>
94 &gt;&gt;&gt; pd.DataFrame(d, index=[100, 200, 300], columns=['z', 'y', 'x']) z y x 100 100 2 1 200 100 4 2 300 100 8 3<p>Как видите, мы указали метки строк 100, 200 и 300, при этом изменив порядок столбцов: z, y, x.</p>
95 <p>Другой способ создать Pandas DataFrame - использовать список словарей:</p>
95 <p>Другой способ создать Pandas DataFrame - использовать список словарей:</p>
96 &gt;&gt;&gt; l = [{'x': 1, 'y': 2, 'z': 100}, ... {'x': 2, 'y': 4, 'z': 100}, ... {'x': 3, 'y': 8, 'z': 100}] &gt;&gt;&gt; pd.DataFrame(l) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Опять же, ключи словаря - это метки столбцов, а значения словаря - это значения данных в DataFrame.</p>
96 &gt;&gt;&gt; l = [{'x': 1, 'y': 2, 'z': 100}, ... {'x': 2, 'y': 4, 'z': 100}, ... {'x': 3, 'y': 8, 'z': 100}] &gt;&gt;&gt; pd.DataFrame(l) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Опять же, ключи словаря - это метки столбцов, а значения словаря - это значения данных в DataFrame.</p>
97 <p>В качестве значений данных можно также использовать<strong>вложенные</strong>списки и даже списки списков. В этих случаях лучше явно указывать метки столбцов, строк или и того и другого:</p>
97 <p>В качестве значений данных можно также использовать<strong>вложенные</strong>списки и даже списки списков. В этих случаях лучше явно указывать метки столбцов, строк или и того и другого:</p>
98 &gt;&gt;&gt; l = [[1, 2, 100], ... [2, 4, 100], ... [3, 8, 100]] &gt;&gt;&gt; pd.DataFrame(l, columns=['x', 'y', 'z']) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Аналогично можно использовать список кортежей - просто замените ими вложенные списки в приведённом выше примере.</p>
98 &gt;&gt;&gt; l = [[1, 2, 100], ... [2, 4, 100], ... [3, 8, 100]] &gt;&gt;&gt; pd.DataFrame(l, columns=['x', 'y', 'z']) x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Аналогично можно использовать список кортежей - просто замените ими вложенные списки в приведённом выше примере.</p>
99 <p>Вы можете передать двумерный массив NumPy в DataFrame так же, как и в вышеприведённом случае с вложенным списком:</p>
99 <p>Вы можете передать двумерный массив NumPy в DataFrame так же, как и в вышеприведённом случае с вложенным списком:</p>
100 &gt;&gt;&gt; arr = np.array([[1, 2, 100], ... [2, 4, 100], ... [3, 8, 100]]) &gt;&gt;&gt; df_ = pd.DataFrame(arr, columns=['x', 'y', 'z']) &gt;&gt;&gt; df_ x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Хотя этот пример выглядит похожим на предыдущий, у него есть одно преимущество: вы можете указать необязательный параметр copy. Когда для copy установлено значение False (настройка по умолчанию), данные из массива NumPy не копируются. Это означает, что исходные данные из массива назначаются DataFrame Pandas. Если вы измените массив, ваш DataFrame тоже изменится:</p>
100 &gt;&gt;&gt; arr = np.array([[1, 2, 100], ... [2, 4, 100], ... [3, 8, 100]]) &gt;&gt;&gt; df_ = pd.DataFrame(arr, columns=['x', 'y', 'z']) &gt;&gt;&gt; df_ x y z 0 1 2 100 1 2 4 100 2 3 8 100<p>Хотя этот пример выглядит похожим на предыдущий, у него есть одно преимущество: вы можете указать необязательный параметр copy. Когда для copy установлено значение False (настройка по умолчанию), данные из массива NumPy не копируются. Это означает, что исходные данные из массива назначаются DataFrame Pandas. Если вы измените массив, ваш DataFrame тоже изменится:</p>
101 &gt;&gt;&gt; arr[0, 0] = 1000 &gt;&gt;&gt; df_ x y z 0 1000 2 100 1 2 4 100 2 3 8 100<p>Как видите, когда вы изменяете первый элемент arr, вы также изменяете df_.</p>
101 &gt;&gt;&gt; arr[0, 0] = 1000 &gt;&gt;&gt; df_ x y z 0 1000 2 100 1 2 4 100 2 3 8 100<p>Как видите, когда вы изменяете первый элемент arr, вы также изменяете df_.</p>
102 <p><strong>Примечание.</strong>Отсутствие копирования значений данных может значительно сэкономить время и вычислительную мощность при работе с большими объёмами данных.</p>
102 <p><strong>Примечание.</strong>Отсутствие копирования значений данных может значительно сэкономить время и вычислительную мощность при работе с большими объёмами данных.</p>
103 <p>Если же указать copy=True, вместо фактических значений в df_ будет создана копия значений arr.</p>
103 <p>Если же указать copy=True, вместо фактических значений в df_ будет создана копия значений arr.</p>
104 <p>Вы можете сохранять и загружать данные и метки из Pandas DataFrame в различные типы файлов, включая CSV, Excel, SQL, JSON и другие, и наоборот. Это очень мощная функция.</p>
104 <p>Вы можете сохранять и загружать данные и метки из Pandas DataFrame в различные типы файлов, включая CSV, Excel, SQL, JSON и другие, и наоборот. Это очень мощная функция.</p>
105 <p>Сохраним DataFrame кандидатов в файл CSV с помощью метода<a>to_csv()</a>:</p>
105 <p>Сохраним DataFrame кандидатов в файл CSV с помощью метода<a>to_csv()</a>:</p>
106 &gt;&gt;&gt; df.to_csv('data.csv')<p>Приведённый выше оператор создаст<a>CSV-файл</a>, вызываемый с помощью data.csv из рабочего каталога:</p>
106 &gt;&gt;&gt; df.to_csv('data.csv')<p>Приведённый выше оператор создаст<a>CSV-файл</a>, вызываемый с помощью data.csv из рабочего каталога:</p>
107 <p>,name,city,age,py-score</p>
107 <p>,name,city,age,py-score</p>
108 <p>101,Xavier,Mexico City,41,88.0</p>
108 <p>101,Xavier,Mexico City,41,88.0</p>
109 <p>102,Ann,Toronto,28,79.0</p>
109 <p>102,Ann,Toronto,28,79.0</p>
110 <p>103,Jana,Prague,33,81.0</p>
110 <p>103,Jana,Prague,33,81.0</p>
111 <p>104,Yi,Shanghai,34,80.0</p>
111 <p>104,Yi,Shanghai,34,80.0</p>
112 <p>105,Robin,Manchester,38,68.0</p>
112 <p>105,Robin,Manchester,38,68.0</p>
113 <p>106,Amal,Cairo,31,61.0</p>
113 <p>106,Amal,Cairo,31,61.0</p>
114 <p>107,Nori,Osaka,37,84.0</p>
114 <p>107,Nori,Osaka,37,84.0</p>
115 <p>Загрузим его с помощью<a>read_csv()</a>:</p>
115 <p>Загрузим его с помощью<a>read_csv()</a>:</p>
116 &gt;&gt;&gt; pd.read_csv('data.csv', index_col=0) name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0 103 Jana Prague 33 81.0 104 Yi Shanghai 34 80.0 105 Robin Manchester 38 68.0 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p>index_col=0 указывает на то, что метки строк должны быть расположены в первом столбце CSV-файла.</p>
116 &gt;&gt;&gt; pd.read_csv('data.csv', index_col=0) name city age py-score 101 Xavier Mexico City 41 88.0 102 Ann Toronto 28 79.0 103 Jana Prague 33 81.0 104 Yi Shanghai 34 80.0 105 Robin Manchester 38 68.0 106 Amal Cairo 31 61.0 107 Nori Osaka 37 84.0<p>index_col=0 указывает на то, что метки строк должны быть расположены в первом столбце CSV-файла.</p>
117 <p>Теперь, когда мы создали DataFrame, можно извлекать из него информацию. Для этого типа объектов в Pandas доступны следующие действия:</p>
117 <p>Теперь, когда мы создали DataFrame, можно извлекать из него информацию. Для этого типа объектов в Pandas доступны следующие действия:</p>
118 <ul><li>получение и изменение меток строк и столбцов в виде последовательностей;</li>
118 <ul><li>получение и изменение меток строк и столбцов в виде последовательностей;</li>
119 <li>представление данных в виде массивов NumPy;</li>
119 <li>представление данных в виде массивов NumPy;</li>
120 <li>проверка и настройке<a>типов данных</a>;</li>
120 <li>проверка и настройке<a>типов данных</a>;</li>
121 <li>анализ размеров объектов DataFrame.</li>
121 <li>анализ размеров объектов DataFrame.</li>
122 </ul><p>Можно получить метки строк DataFrame с помощью атрибутов<a>index</a>и метки столбцов с помощью<a>columns</a>:</p>
122 </ul><p>Можно получить метки строк DataFrame с помощью атрибутов<a>index</a>и метки столбцов с помощью<a>columns</a>:</p>
123 &gt;&gt;&gt; df.index Int64Index([1, 2, 3, 4, 5, 6, 7], dtype='int64') &gt;&gt;&gt; df.columns Index(['name', 'city', 'age', 'py-score'], dtype='object')<p>Как и в любой другой последовательности в Python, вы можете получить любой элемент объекта df.columns:</p>
123 &gt;&gt;&gt; df.index Int64Index([1, 2, 3, 4, 5, 6, 7], dtype='int64') &gt;&gt;&gt; df.columns Index(['name', 'city', 'age', 'py-score'], dtype='object')<p>Как и в любой другой последовательности в Python, вы можете получить любой элемент объекта df.columns:</p>
124 &gt;&gt;&gt; df.columns[1] 'city'<p>Помимо этих доступны другие операции последовательности, включая итерацию по меткам строк или столбцов. Однако в них редко возникает необходимость, так как Pandas предлагает другие виды итераций в DataFrames, которые вы увидите далее.</p>
124 &gt;&gt;&gt; df.columns[1] 'city'<p>Помимо этих доступны другие операции последовательности, включая итерацию по меткам строк или столбцов. Однако в них редко возникает необходимость, так как Pandas предлагает другие виды итераций в DataFrames, которые вы увидите далее.</p>
125 <p>Этот подход можно использовать и для изменения меток:</p>
125 <p>Этот подход можно использовать и для изменения меток:</p>
126 &gt;&gt;&gt; df.index = np.arange(10, 17) &gt;&gt;&gt; df.index Int64Index([10, 11, 12, 13, 14, 15, 16], dtype='int64') &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0<p>В этом примере<a>numpy.arange()</a>используется для создания новой последовательности меток строк, которая содержит целые числа от 10 до 16. Имейте в виду: если вы попытаетесь изменить определённый элемент index или columns, вы получите ошибку TypeError.</p>
126 &gt;&gt;&gt; df.index = np.arange(10, 17) &gt;&gt;&gt; df.index Int64Index([10, 11, 12, 13, 14, 15, 16], dtype='int64') &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0<p>В этом примере<a>numpy.arange()</a>используется для создания новой последовательности меток строк, которая содержит целые числа от 10 до 16. Имейте в виду: если вы попытаетесь изменить определённый элемент index или columns, вы получите ошибку TypeError.</p>
127 <p>Иногда вам может понадобиться извлечь данные из Pandas DataFrame без меток. Чтобы получить массив NumPy с немаркированными данными, используйте метод<a>to_numpy()</a>или свойство<a>values</a>:</p>
127 <p>Иногда вам может понадобиться извлечь данные из Pandas DataFrame без меток. Чтобы получить массив NumPy с немаркированными данными, используйте метод<a>to_numpy()</a>или свойство<a>values</a>:</p>
128 &gt;&gt;&gt; df.to_numpy() array([['Xavier', 'Mexico City', 41, 88.0], ['Ann', 'Toronto', 28, 79.0], ['Jana', 'Prague', 33, 81.0], ['Yi', 'Shanghai', 34, 80.0], ['Robin', 'Manchester', 38, 68.0], ['Amal', 'Cairo', 31, 61.0], ['Nori', 'Osaka', 37, 84.0]], dtype=object)<p>И to_numpy(), и values дают один и тот же результат: они возвращают массив NumPy с данными из DataFrame Pandas:</p>
128 &gt;&gt;&gt; df.to_numpy() array([['Xavier', 'Mexico City', 41, 88.0], ['Ann', 'Toronto', 28, 79.0], ['Jana', 'Prague', 33, 81.0], ['Yi', 'Shanghai', 34, 80.0], ['Robin', 'Manchester', 38, 68.0], ['Amal', 'Cairo', 31, 61.0], ['Nori', 'Osaka', 37, 84.0]], dtype=object)<p>И to_numpy(), и values дают один и тот же результат: они возвращают массив NumPy с данными из DataFrame Pandas:</p>
129 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Однако в официальной документации Pandas рекомендуется использовать to_numpy(), потому что это более гибкий инструмент с полезными параметрами:</p>
129 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Однако в официальной документации Pandas рекомендуется использовать to_numpy(), потому что это более гибкий инструмент с полезными параметрами:</p>
130 <ul><li>dtype - используется, когда нужно указать тип данных результирующего массива. Значение умолчанию - None;</li>
130 <ul><li>dtype - используется, когда нужно указать тип данных результирующего массива. Значение умолчанию - None;</li>
131 <li>copy - если хотите использовать исходные данные из DataFrame, установите этот параметр в False. Если хотите скопировать данные, установите True.</li>
131 <li>copy - если хотите использовать исходные данные из DataFrame, установите этот параметр в False. Если хотите скопировать данные, установите True.</li>
132 </ul><p>Тем не менее вам, скорее всего, чаще будет встречаться values, особенно в старых программах, потому что to_numpy() впервые был представлен только в Pandas 0.24.0.</p>
132 </ul><p>Тем не менее вам, скорее всего, чаще будет встречаться values, особенно в старых программах, потому что to_numpy() впервые был представлен только в Pandas 0.24.0.</p>
133 <p>Типы данных, или<strong>dtypes</strong>, важны, поскольку определяют объём памяти, который использует ваш DataFrame, скорость вычислений и уровень точности расчётов.</p>
133 <p>Типы данных, или<strong>dtypes</strong>, важны, поскольку определяют объём памяти, который использует ваш DataFrame, скорость вычислений и уровень точности расчётов.</p>
134 <p>Pandas в основном построен на <a>типах данных NumPy</a>. Однако в Pandas 1.0 появились собственные дополнительные типы:</p>
134 <p>Pandas в основном построен на <a>типах данных NumPy</a>. Однако в Pandas 1.0 появились собственные дополнительные типы:</p>
135 <ul><li><a>BooleanDtype</a>и <a>BooleanArray</a> - для поддержки отсутствующих логических значений и <a>трёхзначной логики Клини</a>.</li>
135 <ul><li><a>BooleanDtype</a>и <a>BooleanArray</a> - для поддержки отсутствующих логических значений и <a>трёхзначной логики Клини</a>.</li>
136 <li><a>StringDtype</a>и <a>StringArray</a> - специальные строковые типы.</li>
136 <li><a>StringDtype</a>и <a>StringArray</a> - специальные строковые типы.</li>
137 </ul><p>Типы данных для каждого столбца Pandas DataFrame можно получить с помощью dtypes:</p>
137 </ul><p>Типы данных для каждого столбца Pandas DataFrame можно получить с помощью dtypes:</p>
138 &gt;&gt;&gt; df.dtypes name object city object age int64 py-score float64 dtype: object<p>Как видите, dtypes возвращает объект Series с именами столбцов в качестве меток и соответствующими типами данных в качестве значений.</p>
138 &gt;&gt;&gt; df.dtypes name object city object age int64 py-score float64 dtype: object<p>Как видите, dtypes возвращает объект Series с именами столбцов в качестве меток и соответствующими типами данных в качестве значений.</p>
139 <p>Если вы хотите изменить тип данных одного или нескольких столбцов, используйте<a>astype()</a>:</p>
139 <p>Если вы хотите изменить тип данных одного или нескольких столбцов, используйте<a>astype()</a>:</p>
140 &gt;&gt;&gt; df_ = df.astype(dtype={'age': np.int32, 'py-score': np.float32}) &gt;&gt;&gt; df_.dtypes name object city object age int32 py-score float32 dtype: object<p>Самый важный и единственный обязательный параметр для astype() - dtype. Его можно задавать как тип данных или словарь. В случае со словарём ключи будут именами столбцов, а значения - типами данных.</p>
140 &gt;&gt;&gt; df_ = df.astype(dtype={'age': np.int32, 'py-score': np.float32}) &gt;&gt;&gt; df_.dtypes name object city object age int32 py-score float32 dtype: object<p>Самый важный и единственный обязательный параметр для astype() - dtype. Его можно задавать как тип данных или словарь. В случае со словарём ключи будут именами столбцов, а значения - типами данных.</p>
141 <p>Как видите, типы данных для столбцов age и py-score в DataFrame df - int64 и float64 соответственно, то есть 64-битные (или 8-байтовые) целые числа и числа плавающей точкой. А в df_ для тех же столбцов устанавливаются 32-битные (4-байтовые) типы.</p>
141 <p>Как видите, типы данных для столбцов age и py-score в DataFrame df - int64 и float64 соответственно, то есть 64-битные (или 8-байтовые) целые числа и числа плавающей точкой. А в df_ для тех же столбцов устанавливаются 32-битные (4-байтовые) типы.</p>
142 <p>Атрибуты<a>ndim</a>,<a>size</a>и <a>shape</a>отображают, соответственно, количество измерений, количество значений данных по каждому измерению и общее количество значений данных:</p>
142 <p>Атрибуты<a>ndim</a>,<a>size</a>и <a>shape</a>отображают, соответственно, количество измерений, количество значений данных по каждому измерению и общее количество значений данных:</p>
143 &gt;&gt;&gt; df_.ndim 2 &gt;&gt;&gt; df_.shape (7, 4) &gt;&gt;&gt; df_.size 28<p>Экземпляры DataFrame имеют два измерения (строки и столбцы), поэтому ndim имеет значение 2. С другой стороны, у объекта Series только одно измерение, поэтому для него ndim будет отображаться как 1.</p>
143 &gt;&gt;&gt; df_.ndim 2 &gt;&gt;&gt; df_.shape (7, 4) &gt;&gt;&gt; df_.size 28<p>Экземпляры DataFrame имеют два измерения (строки и столбцы), поэтому ndim имеет значение 2. С другой стороны, у объекта Series только одно измерение, поэтому для него ndim будет отображаться как 1.</p>
144 <p>В атрибуте shape хранится кортеж с количеством строк (в данном случае 7) и столбцов (4). Наконец, size отображает целое число, равное количеству значений в DataFrame (28).</p>
144 <p>В атрибуте shape хранится кортеж с количеством строк (в данном случае 7) и столбцов (4). Наконец, size отображает целое число, равное количеству значений в DataFrame (28).</p>
145 <p>С помощью<a>memory_usage()</a>можно узнать, сколько памяти занимает каждый столбец:</p>
145 <p>С помощью<a>memory_usage()</a>можно узнать, сколько памяти занимает каждый столбец:</p>
146 &gt;&gt;&gt; df_.memory_usage() Index 56 name 56 city 56 age 28 py-score 28 dtype: int64<p>Как видите, memory_usage() возвращает объект Series с именами столбцов в качестве меток и памяти в байтах в качестве данных. Если вы хотите исключить использование памяти столбцом, содержащим метки строк, установите необязательный аргумент index=False.</p>
146 &gt;&gt;&gt; df_.memory_usage() Index 56 name 56 city 56 age 28 py-score 28 dtype: int64<p>Как видите, memory_usage() возвращает объект Series с именами столбцов в качестве меток и памяти в байтах в качестве данных. Если вы хотите исключить использование памяти столбцом, содержащим метки строк, установите необязательный аргумент index=False.</p>
147 <p>В приведённом выше примере последние два столбца age и py-score используют по 28 байтов памяти: столбцы имеют семь значений, каждое из которых представляет собой целое число, занимающее 32 бита, или 4 байта. 7 целых чисел, умноженных на 4 байта, дают в общей сложности 28 байтов.</p>
147 <p>В приведённом выше примере последние два столбца age и py-score используют по 28 байтов памяти: столбцы имеют семь значений, каждое из которых представляет собой целое число, занимающее 32 бита, или 4 байта. 7 целых чисел, умноженных на 4 байта, дают в общей сложности 28 байтов.</p>
148 <p>Вы уже знаете, как вызвать определённую строку или столбец Pandas DataFrame в виде объекта Series:</p>
148 <p>Вы уже знаете, как вызвать определённую строку или столбец Pandas DataFrame в виде объекта Series:</p>
149 &gt;&gt;&gt; df['name'] 10 Xavier 11 Ann 12 Jana 13 Yi 14 Robin 15 Amal 16 Nori Name: name, dtype: object &gt;&gt;&gt; df.loc[10] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object<p>В первом примере доступ к столбцу осуществляется с помощью name - так же, как к элементу из словаря, с использованием его метки в качестве ключа. Аналогично, если метка столбца - допустимый идентификатор Python, вы можете использовать для доступа к нему оператор точку. Во втором примере получаем строку по метке с помощью loc[].</p>
149 &gt;&gt;&gt; df['name'] 10 Xavier 11 Ann 12 Jana 13 Yi 14 Robin 15 Amal 16 Nori Name: name, dtype: object &gt;&gt;&gt; df.loc[10] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object<p>В первом примере доступ к столбцу осуществляется с помощью name - так же, как к элементу из словаря, с использованием его метки в качестве ключа. Аналогично, если метка столбца - допустимый идентификатор Python, вы можете использовать для доступа к нему оператор точку. Во втором примере получаем строку по метке с помощью loc[].</p>
150 <p>В дополнение к loc[], Pandas предлагает метод<a>iloc[]</a>, который извлекает строку или столбец по их целочисленному индексу. В большинстве случаев можно использовать любой из них:</p>
150 <p>В дополнение к loc[], Pandas предлагает метод<a>iloc[]</a>, который извлекает строку или столбец по их целочисленному индексу. В большинстве случаев можно использовать любой из них:</p>
151 &gt;&gt;&gt; df.loc[10] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object &gt;&gt;&gt; df.iloc[0] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object<p>df.loc[10] возвращает строку с меткой 10. Точно так же df.iloc[0] возвращает строку с отсчитываемым от нуля индексом 0, то есть первую строку. Как видите, оба оператора возвращают одну и ту же строку в качестве объекта Series.</p>
151 &gt;&gt;&gt; df.loc[10] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object &gt;&gt;&gt; df.iloc[0] name Xavier city Mexico City age 41 py-score 88 Name: 10, dtype: object<p>df.loc[10] возвращает строку с меткой 10. Точно так же df.iloc[0] возвращает строку с отсчитываемым от нуля индексом 0, то есть первую строку. Как видите, оба оператора возвращают одну и ту же строку в качестве объекта Series.</p>
152 <p>Всего у Pandas четыре аксессора:</p>
152 <p>Всего у Pandas четыре аксессора:</p>
153 <ul><li>loc[] - принимает метки строк и столбцов, выдаёт Series или DataFrames. Можно использовать как для получения целых строк или столбцов, так и для их частей.</li>
153 <ul><li>loc[] - принимает метки строк и столбцов, выдаёт Series или DataFrames. Можно использовать как для получения целых строк или столбцов, так и для их частей.</li>
154 <li>iloc[] - принимает отсчитываемые от нуля индексы строк и столбцов, выдает Series или DataFrames.Также годится и для целых строк (столбцов), и для их частей.</li>
154 <li>iloc[] - принимает отсчитываемые от нуля индексы строк и столбцов, выдает Series или DataFrames.Также годится и для целых строк (столбцов), и для их частей.</li>
155 <li>at[] - принимает метки строк и столбцов, выдаёт одно значение данных.</li>
155 <li>at[] - принимает метки строк и столбцов, выдаёт одно значение данных.</li>
156 <li>iat[] - принимает отсчитываемые от нуля индексы строк и столбцов, выдаёт одно значение данных.</li>
156 <li>iat[] - принимает отсчитываемые от нуля индексы строк и столбцов, выдаёт одно значение данных.</li>
157 </ul><p>loc[] и iloc[] более эффективные: они поддерживают срезы и индексирование в стиле NumPy. Получим с их помощью доступ к столбцу:</p>
157 </ul><p>loc[] и iloc[] более эффективные: они поддерживают срезы и индексирование в стиле NumPy. Получим с их помощью доступ к столбцу:</p>
158 &gt;&gt;&gt; df.loc[:, 'city'] 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object &gt;&gt;&gt; df.iloc[:, 1] 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object<p>df.loc[:, 'city'] выдаёт столбец city. Конструкция<a>среза</a>[ :] в месте метки строки означает, что должны быть включены все строки. df.iloc[:, 1] выдаёт тот же столбец, поскольку отсчитываемый от нуля индекс 1 относится ко второму столбцу city.</p>
158 &gt;&gt;&gt; df.loc[:, 'city'] 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object &gt;&gt;&gt; df.iloc[:, 1] 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object<p>df.loc[:, 'city'] выдаёт столбец city. Конструкция<a>среза</a>[ :] в месте метки строки означает, что должны быть включены все строки. df.iloc[:, 1] выдаёт тот же столбец, поскольку отсчитываемый от нуля индекс 1 относится ко второму столбцу city.</p>
159 <p>Как и в случае с NumPy, вы можете использовать срезы вместе со списками или массивами вместо индексов, чтобы получить несколько строк или столбцов:</p>
159 <p>Как и в случае с NumPy, вы можете использовать срезы вместе со списками или массивами вместо индексов, чтобы получить несколько строк или столбцов:</p>
160 &gt;&gt;&gt; df.loc[11:15, ['name', 'city']] name city 11 Ann Toronto 12 Jana Prague 13 Yi Shanghai 14 Robin Manchester 15 Amal Cairo &gt;&gt;&gt; df.iloc[1:6, [0, 1]] name city 11 Ann Toronto 12 Jana Prague 13 Yi Shanghai 14 Robin Manchester 15 Amal Cairo<p>Как видно из представленных выше примеров, можно использовать:</p>
160 &gt;&gt;&gt; df.loc[11:15, ['name', 'city']] name city 11 Ann Toronto 12 Jana Prague 13 Yi Shanghai 14 Robin Manchester 15 Amal Cairo &gt;&gt;&gt; df.iloc[1:6, [0, 1]] name city 11 Ann Toronto 12 Jana Prague 13 Yi Shanghai 14 Robin Manchester 15 Amal Cairo<p>Как видно из представленных выше примеров, можно использовать:</p>
161 <ul><li><strong>срезы</strong>для получения строк с метками от 11 до 15, которые эквивалентны индексам от 1 до 5;</li>
161 <ul><li><strong>срезы</strong>для получения строк с метками от 11 до 15, которые эквивалентны индексам от 1 до 5;</li>
162 <li><strong>списки</strong>для получения столбцов name и city, которые эквивалентны индексам 0 и 1.</li>
162 <li><strong>списки</strong>для получения столбцов name и city, которые эквивалентны индексам 0 и 1.</li>
163 </ul><p>Оба оператора возвращают пересечение из искомых пяти строк и двух столбцов.</p>
163 </ul><p>Оба оператора возвращают пересечение из искомых пяти строк и двух столбцов.</p>
164 <p>Следует отметить важное различие между loc[] и iloc[]. Когда мы задали в loc[] метки строк 11:15, то получили строки 11-15. А когда в iloc[] задали индексы 1:6, то получили строки с индексами от 1 до 5.</p>
164 <p>Следует отметить важное различие между loc[] и iloc[]. Когда мы задали в loc[] метки строк 11:15, то получили строки 11-15. А когда в iloc[] задали индексы 1:6, то получили строки с индексами от 1 до 5.</p>
165 <p>Причина в том, что в iloc[] остановка среза исключительная, то есть второй индекс не показывается в выдаваемых значениях. Это похоже на срезы в Python и массивы NumPy. А в loc[] индексы<strong>инклюзивны</strong>, то есть оба включаются в выдаваемые значения.</p>
165 <p>Причина в том, что в iloc[] остановка среза исключительная, то есть второй индекс не показывается в выдаваемых значениях. Это похоже на срезы в Python и массивы NumPy. А в loc[] индексы<strong>инклюзивны</strong>, то есть оба включаются в выдаваемые значения.</p>
166 <p>Вы можете пропускать строки и столбцы в iloc[] так же, как и при нарезке кортежей, списков и массивов NumPy:</p>
166 <p>Вы можете пропускать строки и столбцы в iloc[] так же, как и при нарезке кортежей, списков и массивов NumPy:</p>
167 &gt;&gt;&gt; df.iloc[1:6:2, 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object<p>В этом примере мы указываем нужные индексы строк с помощью среза 1:6:2. Это означает, что выборка элементов начинается со строки с индексом 1 (вторая строка), останавливается перед строкой с индексом 6 (седьмая строка) и пропускает каждую вторую строку.</p>
167 &gt;&gt;&gt; df.iloc[1:6:2, 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object<p>В этом примере мы указываем нужные индексы строк с помощью среза 1:6:2. Это означает, что выборка элементов начинается со строки с индексом 1 (вторая строка), останавливается перед строкой с индексом 6 (седьмая строка) и пропускает каждую вторую строку.</p>
168 <p>Вместо среза вы можете использовать встроенный класс Python<a>slice()</a>, а также<a>numpy.s[]</a>или<a>pd.IndexSlice[]</a>:</p>
168 <p>Вместо среза вы можете использовать встроенный класс Python<a>slice()</a>, а также<a>numpy.s[]</a>или<a>pd.IndexSlice[]</a>:</p>
169 &gt;&gt;&gt; df.iloc[slice(1, 6, 2), 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object &gt;&gt;&gt; df.iloc[np.s_[1:6:2], 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object &gt;&gt;&gt; df.iloc[pd.IndexSlice[1:6:2], 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object<p>Используя loc[] и iloc[], можно также получать определённые значения данных. Однако, когда вам нужно только одно значение, Pandas рекомендует использовать специализированные методы доступа at[] и iat[]:</p>
169 &gt;&gt;&gt; df.iloc[slice(1, 6, 2), 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object &gt;&gt;&gt; df.iloc[np.s_[1:6:2], 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object &gt;&gt;&gt; df.iloc[pd.IndexSlice[1:6:2], 0] 11 Ann 13 Yi 15 Amal Name: name, dtype: object<p>Используя loc[] и iloc[], можно также получать определённые значения данных. Однако, когда вам нужно только одно значение, Pandas рекомендует использовать специализированные методы доступа at[] и iat[]:</p>
170 &gt;&gt;&gt; df.at[12, 'name'] 'Jana' &gt;&gt;&gt; df.iat[2, 0] 'Jana'<p>Здесь at[] используется для получения имени одного кандидата, с помощью соответствующих меток столбца и строки, а iat[] для получения того же имени с помощью индексов.</p>
170 &gt;&gt;&gt; df.at[12, 'name'] 'Jana' &gt;&gt;&gt; df.iat[2, 0] 'Jana'<p>Здесь at[] используется для получения имени одного кандидата, с помощью соответствующих меток столбца и строки, а iat[] для получения того же имени с помощью индексов.</p>
171 <p>Чтобы изменить DataFrame через аксессор, нужно задать последовательность Python, массив NumPy или число:</p>
171 <p>Чтобы изменить DataFrame через аксессор, нужно задать последовательность Python, массив NumPy или число:</p>
172 &gt;&gt;&gt; df.loc[:, 'py-score'] 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64 &gt;&gt;&gt; df.loc[:13, 'py-score'] = [40, 50, 60, 70] &gt;&gt;&gt; df.loc[14:, 'py-score'] = 0 &gt;&gt;&gt; df['py-score'] 10 40.0 11 50.0 12 60.0 13 70.0 14 0.0 15 0.0 16 0.0 Name: py-score, dtype: float64<p>Оператор df.loc[:13, 'py-score'] = [40, 50, 60, 70] изменяет первые четыре элемента в строках от 10 до 13 столбца py-score, используя значения из предоставленного списка. df.loc[14:, 'py-score'] = 0 устанавливает остальные значения в этом столбце в 0.</p>
172 &gt;&gt;&gt; df.loc[:, 'py-score'] 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64 &gt;&gt;&gt; df.loc[:13, 'py-score'] = [40, 50, 60, 70] &gt;&gt;&gt; df.loc[14:, 'py-score'] = 0 &gt;&gt;&gt; df['py-score'] 10 40.0 11 50.0 12 60.0 13 70.0 14 0.0 15 0.0 16 0.0 Name: py-score, dtype: float64<p>Оператор df.loc[:13, 'py-score'] = [40, 50, 60, 70] изменяет первые четыре элемента в строках от 10 до 13 столбца py-score, используя значения из предоставленного списка. df.loc[14:, 'py-score'] = 0 устанавливает остальные значения в этом столбце в 0.</p>
173 <p>В следующем примере показано, как получить доступ к элементам через iloc[], используя отрицательные индексы:</p>
173 <p>В следующем примере показано, как получить доступ к элементам через iloc[], используя отрицательные индексы:</p>
174 &gt;&gt;&gt; df.iloc[:, -1] = np.array([88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0]) &gt;&gt;&gt; df['py-score'] 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64<p>Здесь мы изменили последний столбец ('py-score'), который соответствует целочисленному индексу столбца -1.</p>
174 &gt;&gt;&gt; df.iloc[:, -1] = np.array([88.0, 79.0, 81.0, 80.0, 68.0, 61.0, 84.0]) &gt;&gt;&gt; df['py-score'] 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64<p>Здесь мы изменили последний столбец ('py-score'), который соответствует целочисленному индексу столбца -1.</p>
175 <p>Pandas предоставляет несколько удобных методов для вставки и удаления строк и столбцов.</p>
175 <p>Pandas предоставляет несколько удобных методов для вставки и удаления строк и столбцов.</p>
176 <p>Допустим, нам нужно добавить нового человека в свой список кандидатов на работу. Для этого создадим новый объект Series:</p>
176 <p>Допустим, нам нужно добавить нового человека в свой список кандидатов на работу. Для этого создадим новый объект Series:</p>
177 &gt;&gt;&gt; john = pd.Series(data=['John', 'Boston', 34, 79], ... index=df.columns, name=17) &gt;&gt;&gt; john name John city Boston age 34 py-score 79 Name: 17, dtype: object &gt;&gt;&gt; john.name 17<p>Объект john хранит метки, соответствующие меткам столбцов из df, поэтому нам понадобится index=df.columns.</p>
177 &gt;&gt;&gt; john = pd.Series(data=['John', 'Boston', 34, 79], ... index=df.columns, name=17) &gt;&gt;&gt; john name John city Boston age 34 py-score 79 Name: 17, dtype: object &gt;&gt;&gt; john.name 17<p>Объект john хранит метки, соответствующие меткам столбцов из df, поэтому нам понадобится index=df.columns.</p>
178 <p>Поместим новую строку john в конец df с помощью<a>append()</a>:</p>
178 <p>Поместим новую строку john в конец df с помощью<a>append()</a>:</p>
179 &gt;&gt;&gt; df = df.append(john) &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0 17 John Boston 34 79.0<p>Обратите внимание, как Pandas использует атрибут john.name со значением 17, чтобы указать метку для новой строки.</p>
179 &gt;&gt;&gt; df = df.append(john) &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0 17 John Boston 34 79.0<p>Обратите внимание, как Pandas использует атрибут john.name со значением 17, чтобы указать метку для новой строки.</p>
180 <p>Мы добавили новую строку с помощью append(). Удалить её можно с помощью метода drop(), указав параметр labels:</p>
180 <p>Мы добавили новую строку с помощью append(). Удалить её можно с помощью метода drop(), указав параметр labels:</p>
181 &gt;&gt;&gt; df = df.drop(labels=[17]) &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0<p>Если вы зададите inplace=True, исходный DataFrame будет изменён, а метод вернёт None.</p>
181 &gt;&gt;&gt; df = df.drop(labels=[17]) &gt;&gt;&gt; df name city age py-score 10 Xavier Mexico City 41 88.0 11 Ann Toronto 28 79.0 12 Jana Prague 33 81.0 13 Yi Shanghai 34 80.0 14 Robin Manchester 38 68.0 15 Amal Cairo 31 61.0 16 Nori Osaka 37 84.0<p>Если вы зададите inplace=True, исходный DataFrame будет изменён, а метод вернёт None.</p>
182 <p>Самый простой способ вставить столбец в DataFrame - следовать той же процедуре, которую используют при добавлении элемента в словарь. Например, вот как можно добавить столбец, содержащий баллы кандидатов по тесту JavaScript:</p>
182 <p>Самый простой способ вставить столбец в DataFrame - следовать той же процедуре, которую используют при добавлении элемента в словарь. Например, вот как можно добавить столбец, содержащий баллы кандидатов по тесту JavaScript:</p>
183 &gt;&gt;&gt; df['js-score'] = np.array([71.0, 95.0, 88.0, 79.0, 91.0, 91.0, 80.0]) &gt;&gt;&gt; df name city age py-score js-score 10 Xavier Mexico City 41 88.0 71.0 11 Ann Toronto 28 79.0 95.0 12 Jana Prague 33 81.0 88.0 13 Yi Shanghai 34 80.0 79.0 14 Robin Manchester 38 68.0 91.0 15 Amal Cairo 31 61.0 91.0 16 Nori Osaka 37 84.0 80.0<p>Вы можете также добавить новый столбец с одним значением:</p>
183 &gt;&gt;&gt; df['js-score'] = np.array([71.0, 95.0, 88.0, 79.0, 91.0, 91.0, 80.0]) &gt;&gt;&gt; df name city age py-score js-score 10 Xavier Mexico City 41 88.0 71.0 11 Ann Toronto 28 79.0 95.0 12 Jana Prague 33 81.0 88.0 13 Yi Shanghai 34 80.0 79.0 14 Robin Manchester 38 68.0 91.0 15 Amal Cairo 31 61.0 91.0 16 Nori Osaka 37 84.0 80.0<p>Вы можете также добавить новый столбец с одним значением:</p>
184 &gt;&gt;&gt; df['total-score'] = 0.0 &gt;&gt;&gt; df name city age py-score js-score total-score 10 Xavier Mexico City 41 88.0 71.0 0.0 11 Ann Toronto 28 79.0 95.0 0.0 12 Jana Prague 33 81.0 88.0 0.0 13 Yi Shanghai 34 80.0 79.0 0.0 14 Robin Manchester 38 68.0 91.0 0.0 15 Amal Cairo 31 61.0 91.0 0.0 16 Nori Osaka 37 84.0 80.0 0.0<p>В DataFrame df теперь есть дополнительный столбец, заполненный нулями. Однако такой способ не позволяет указать расположение нового столбца. Если это важно, можно использовать insert(). Попробуем вставить ещё один столбец с результатами теста Django:</p>
184 &gt;&gt;&gt; df['total-score'] = 0.0 &gt;&gt;&gt; df name city age py-score js-score total-score 10 Xavier Mexico City 41 88.0 71.0 0.0 11 Ann Toronto 28 79.0 95.0 0.0 12 Jana Prague 33 81.0 88.0 0.0 13 Yi Shanghai 34 80.0 79.0 0.0 14 Robin Manchester 38 68.0 91.0 0.0 15 Amal Cairo 31 61.0 91.0 0.0 16 Nori Osaka 37 84.0 80.0 0.0<p>В DataFrame df теперь есть дополнительный столбец, заполненный нулями. Однако такой способ не позволяет указать расположение нового столбца. Если это важно, можно использовать insert(). Попробуем вставить ещё один столбец с результатами теста Django:</p>
185 &gt;&gt;&gt; df.insert(loc=4, column='django-score', ... value=np.array([86.0, 81.0, 78.0, 88.0, 74.0, 70.0, 81.0])) &gt;&gt;&gt; df name city age py-score django-score js-score total-score 10 Xavier Mexico City 41 88.0 86.0 71.0 0.0 11 Ann Toronto 28 79.0 81.0 95.0 0.0 12 Jana Prague 33 81.0 78.0 88.0 0.0 13 Yi Shanghai 34 80.0 88.0 79.0 0.0 14 Robin Manchester 38 68.0 74.0 91.0 0.0 15 Amal Cairo 31 61.0 70.0 91.0 0.0 16 Nori Osaka 37 84.0 81.0 80.0 0.0<p>Параметр loc определяет расположение, или отсчитываемый от нуля индекс нового столбца в дата-фрейме. column устанавливает метку нового столбца, а value указывает значения данных для вставки.</p>
185 &gt;&gt;&gt; df.insert(loc=4, column='django-score', ... value=np.array([86.0, 81.0, 78.0, 88.0, 74.0, 70.0, 81.0])) &gt;&gt;&gt; df name city age py-score django-score js-score total-score 10 Xavier Mexico City 41 88.0 86.0 71.0 0.0 11 Ann Toronto 28 79.0 81.0 95.0 0.0 12 Jana Prague 33 81.0 78.0 88.0 0.0 13 Yi Shanghai 34 80.0 88.0 79.0 0.0 14 Robin Manchester 38 68.0 74.0 91.0 0.0 15 Amal Cairo 31 61.0 70.0 91.0 0.0 16 Nori Osaka 37 84.0 81.0 80.0 0.0<p>Параметр loc определяет расположение, или отсчитываемый от нуля индекс нового столбца в дата-фрейме. column устанавливает метку нового столбца, а value указывает значения данных для вставки.</p>
186 <p>Можно удалить один или несколько столбцов так же, как и в обычном словаре Python, используя оператор del:</p>
186 <p>Можно удалить один или несколько столбцов так же, как и в обычном словаре Python, используя оператор del:</p>
187 &gt;&gt;&gt; del df['total-score'] &gt;&gt;&gt; df name city age py-score django-score js-score 10 Xavier Mexico City 41 88.0 86.0 71.0 11 Ann Toronto 28 79.0 81.0 95.0 12 Jana Prague 33 81.0 78.0 88.0 13 Yi Shanghai 34 80.0 88.0 79.0 14 Robin Manchester 38 68.0 74.0 91.0 15 Amal Cairo 31 61.0 70.0 91.0 16 Nori Osaka 37 84.0 81.0 80.0<p>Теперь в df нет колонки total-score. Ещё одно сходство со словарями заключается в том, что можно использовать метод pop(), который удаляет указанный столбец и возвращает его. Это означает, что вы могли бы написать что-то вроде df.pop('total-score') вместо del.</p>
187 &gt;&gt;&gt; del df['total-score'] &gt;&gt;&gt; df name city age py-score django-score js-score 10 Xavier Mexico City 41 88.0 86.0 71.0 11 Ann Toronto 28 79.0 81.0 95.0 12 Jana Prague 33 81.0 78.0 88.0 13 Yi Shanghai 34 80.0 88.0 79.0 14 Robin Manchester 38 68.0 74.0 91.0 15 Amal Cairo 31 61.0 70.0 91.0 16 Nori Osaka 37 84.0 81.0 80.0<p>Теперь в df нет колонки total-score. Ещё одно сходство со словарями заключается в том, что можно использовать метод pop(), который удаляет указанный столбец и возвращает его. Это означает, что вы могли бы написать что-то вроде df.pop('total-score') вместо del.</p>
188 <p>Также можно удалить один или несколько столбцов с помощью drop(). Нужно лишь указать метки нужных столбцов с помощью параметра labels и выставить аргумент axis=1:</p>
188 <p>Также можно удалить один или несколько столбцов с помощью drop(). Нужно лишь указать метки нужных столбцов с помощью параметра labels и выставить аргумент axis=1:</p>
189 &gt;&gt;&gt; df = df.drop(labels='age', axis=1) &gt;&gt;&gt; df name city py-score django-score js-score 10 Xavier Mexico City 88.0 86.0 71.0 11 Ann Toronto 79.0 81.0 95.0 12 Jana Prague 81.0 78.0 88.0 13 Yi Shanghai 80.0 88.0 79.0 14 Robin Manchester 68.0 74.0 91.0 15 Amal Cairo 61.0 70.0 91.0 16 Nori Osaka 84.0 81.0 80.0<p>Например, сейчас мы удалили столбец age.</p>
189 &gt;&gt;&gt; df = df.drop(labels='age', axis=1) &gt;&gt;&gt; df name city py-score django-score js-score 10 Xavier Mexico City 88.0 86.0 71.0 11 Ann Toronto 79.0 81.0 95.0 12 Jana Prague 81.0 78.0 88.0 13 Yi Shanghai 80.0 88.0 79.0 14 Robin Manchester 68.0 74.0 91.0 15 Amal Cairo 61.0 70.0 91.0 16 Nori Osaka 84.0 81.0 80.0<p>Например, сейчас мы удалили столбец age.</p>
190 <p>По умолчанию, drop() выдаёт дата-фрейм без указанных столбцов, если вы не передадите inplace=True.</p>
190 <p>По умолчанию, drop() выдаёт дата-фрейм без указанных столбцов, если вы не передадите inplace=True.</p>
191 <p>Основные арифметические операции вроде сложения, вычитания, умножения и деления в Pandas Series и объектах DataFrame производятся так же, как и в массивах NumPy:</p>
191 <p>Основные арифметические операции вроде сложения, вычитания, умножения и деления в Pandas Series и объектах DataFrame производятся так же, как и в массивах NumPy:</p>
192 &gt;&gt;&gt; df['py-score'] + df['js-score'] 10 159.0 11 174.0 12 169.0 13 159.0 14 159.0 15 152.0 16 164.0 dtype: float64 &gt;&gt;&gt; df['py-score'] / 100 10 0.88 11 0.79 12 0.81 13 0.80 14 0.68 15 0.61 16 0.84 Name: py-score, dtype: float64<p>Кроме того, можно вставлять новые столбцы с более сложными арифметическими действиями. Например, попробуем рассчитать total (общий балл) наших кандидатов в виде линейной комбинации их баллов по Python, Django и JavaScript:</p>
192 &gt;&gt;&gt; df['py-score'] + df['js-score'] 10 159.0 11 174.0 12 169.0 13 159.0 14 159.0 15 152.0 16 164.0 dtype: float64 &gt;&gt;&gt; df['py-score'] / 100 10 0.88 11 0.79 12 0.81 13 0.80 14 0.68 15 0.61 16 0.84 Name: py-score, dtype: float64<p>Кроме того, можно вставлять новые столбцы с более сложными арифметическими действиями. Например, попробуем рассчитать total (общий балл) наших кандидатов в виде линейной комбинации их баллов по Python, Django и JavaScript:</p>
193 &gt;&gt;&gt; df['total'] =\ ... 0.4 * df['py-score'] + 0.3 * df['django-score'] + 0.3 * df['js-score'] &gt;&gt;&gt; df name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 16 Nori Osaka 84.0 81.0 80.0 81.9<p>В большинстве программ с NumPy и SciPy в качестве аргументов можно передавать Pandas Series и объекты DataFrame, вместо массивов NumPy. Чтобы проиллюстрировать это, попробуем рассчитать результаты тестов кандидатов, используя процедуру NumPy numpy.average().</p>
193 &gt;&gt;&gt; df['total'] =\ ... 0.4 * df['py-score'] + 0.3 * df['django-score'] + 0.3 * df['js-score'] &gt;&gt;&gt; df name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 16 Nori Osaka 84.0 81.0 80.0 81.9<p>В большинстве программ с NumPy и SciPy в качестве аргументов можно передавать Pandas Series и объекты DataFrame, вместо массивов NumPy. Чтобы проиллюстрировать это, попробуем рассчитать результаты тестов кандидатов, используя процедуру NumPy numpy.average().</p>
194 <p>Вместо того чтобы передавать массив NumPy в numpy.average(), передадим часть DataFrame:</p>
194 <p>Вместо того чтобы передавать массив NumPy в numpy.average(), передадим часть DataFrame:</p>
195 &gt;&gt;&gt; import numpy as np &gt;&gt;&gt; score = df.iloc[:, 2:5] &gt;&gt;&gt; score py-score django-score js-score 10 88.0 86.0 71.0 11 79.0 81.0 95.0 12 81.0 78.0 88.0 13 80.0 88.0 79.0 14 68.0 74.0 91.0 15 61.0 70.0 91.0 16 84.0 81.0 80.0 &gt;&gt;&gt; np.average(score, axis=1, ... weights=[0.4, 0.3, 0.3]) array([82.3, 84.4, 82.2, 82.1, 76.7, 72.7, 81.9])<p>Переменная score ссылается на DataFrame с оценками по Python, Django и JavaScript. Используем score в качестве аргумента numpy.average() и получим линейную комбинацию столбцов с указанными весами.</p>
195 &gt;&gt;&gt; import numpy as np &gt;&gt;&gt; score = df.iloc[:, 2:5] &gt;&gt;&gt; score py-score django-score js-score 10 88.0 86.0 71.0 11 79.0 81.0 95.0 12 81.0 78.0 88.0 13 80.0 88.0 79.0 14 68.0 74.0 91.0 15 61.0 70.0 91.0 16 84.0 81.0 80.0 &gt;&gt;&gt; np.average(score, axis=1, ... weights=[0.4, 0.3, 0.3]) array([82.3, 84.4, 82.2, 82.1, 76.7, 72.7, 81.9])<p>Переменная score ссылается на DataFrame с оценками по Python, Django и JavaScript. Используем score в качестве аргумента numpy.average() и получим линейную комбинацию столбцов с указанными весами.</p>
196 <p>Но это ещё не всё! Вы можете использовать массив NumPy, возвращаемый average() как новый столбец df. Сначала удалите существующий столбец total из df, а затем добавьте новый:</p>
196 <p>Но это ещё не всё! Вы можете использовать массив NumPy, возвращаемый average() как новый столбец df. Сначала удалите существующий столбец total из df, а затем добавьте новый:</p>
197 &gt;&gt;&gt; del df['total'] &gt;&gt;&gt; df name city py-score django-score js-score 10 Xavier Mexico City 88.0 86.0 71.0 11 Ann Toronto 79.0 81.0 95.0 12 Jana Prague 81.0 78.0 88.0 13 Yi Shanghai 80.0 88.0 79.0 14 Robin Manchester 68.0 74.0 91.0 15 Amal Cairo 61.0 70.0 91.0 16 Nori Osaka 84.0 81.0 80.0 &gt;&gt;&gt; df['total'] = np.average(df.iloc[:, 2:5], axis=1, ... weights=[0.4, 0.3, 0.3]) &gt;&gt;&gt; df name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Результат такой же, как и в предыдущем примере, но здесь вместо того, чтобы писать собственный код, мы использовали готовую функцию NumPy.</p>
197 &gt;&gt;&gt; del df['total'] &gt;&gt;&gt; df name city py-score django-score js-score 10 Xavier Mexico City 88.0 86.0 71.0 11 Ann Toronto 79.0 81.0 95.0 12 Jana Prague 81.0 78.0 88.0 13 Yi Shanghai 80.0 88.0 79.0 14 Robin Manchester 68.0 74.0 91.0 15 Amal Cairo 61.0 70.0 91.0 16 Nori Osaka 84.0 81.0 80.0 &gt;&gt;&gt; df['total'] = np.average(df.iloc[:, 2:5], axis=1, ... weights=[0.4, 0.3, 0.3]) &gt;&gt;&gt; df name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Результат такой же, как и в предыдущем примере, но здесь вместо того, чтобы писать собственный код, мы использовали готовую функцию NumPy.</p>
198 <p>Сортировать Pandas DataFrame можно с помощью sort_values():</p>
198 <p>Сортировать Pandas DataFrame можно с помощью sort_values():</p>
199 &gt;&gt;&gt; df.sort_values(by='js-score', ascending=False) name city py-score django-score js-score total 11 Ann Toronto 79.0 81.0 95.0 84.4 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 12 Jana Prague 81.0 78.0 88.0 82.2 16 Nori Osaka 84.0 81.0 80.0 81.9 13 Yi Shanghai 80.0 88.0 79.0 82.1 10 Xavier Mexico City 88.0 86.0 71.0 82.3<p>В этом примере дата-фрейм сортируется по значениям в столбце js-score. Параметр by задает метку строки или столбца для сортировки, ascending указывает сортировать элементы по возрастанию (True) или по убыванию (False). По умолчанию элементы сортируются по убыванию. Параметр axis определяет, что будет сортироваться: строки (axis=0) или столбцы (axis=1).</p>
199 &gt;&gt;&gt; df.sort_values(by='js-score', ascending=False) name city py-score django-score js-score total 11 Ann Toronto 79.0 81.0 95.0 84.4 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7 12 Jana Prague 81.0 78.0 88.0 82.2 16 Nori Osaka 84.0 81.0 80.0 81.9 13 Yi Shanghai 80.0 88.0 79.0 82.1 10 Xavier Mexico City 88.0 86.0 71.0 82.3<p>В этом примере дата-фрейм сортируется по значениям в столбце js-score. Параметр by задает метку строки или столбца для сортировки, ascending указывает сортировать элементы по возрастанию (True) или по убыванию (False). По умолчанию элементы сортируются по убыванию. Параметр axis определяет, что будет сортироваться: строки (axis=0) или столбцы (axis=1).</p>
200 <p>Если вы хотите отсортировать по нескольким столбцам, просто передайте списки в качестве аргументов для by и ascending:</p>
200 <p>Если вы хотите отсортировать по нескольким столбцам, просто передайте списки в качестве аргументов для by и ascending:</p>
201 &gt;&gt;&gt; df.sort_values(by=['total', 'py-score'], ascending=[False, False]) name city py-score django-score js-score total 11 Ann Toronto 79.0 81.0 95.0 84.4 10 Xavier Mexico City 88.0 86.0 71.0 82.3 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 16 Nori Osaka 84.0 81.0 80.0 81.9 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7<p>В этом случае DataFrame сортируется по столбцу total, но если два значения совпадают, их порядок определяется значениями из столбца py-score.</p>
201 &gt;&gt;&gt; df.sort_values(by=['total', 'py-score'], ascending=[False, False]) name city py-score django-score js-score total 11 Ann Toronto 79.0 81.0 95.0 84.4 10 Xavier Mexico City 88.0 86.0 71.0 82.3 12 Jana Prague 81.0 78.0 88.0 82.2 13 Yi Shanghai 80.0 88.0 79.0 82.1 16 Nori Osaka 84.0 81.0 80.0 81.9 14 Robin Manchester 68.0 74.0 91.0 76.7 15 Amal Cairo 61.0 70.0 91.0 72.7<p>В этом случае DataFrame сортируется по столбцу total, но если два значения совпадают, их порядок определяется значениями из столбца py-score.</p>
202 <p>Необязательный параметр inplace также можно использовать с sort_values(). По умолчанию оно установлено в False, что обеспечивает выдачу нового DataFrame. Когда вы установите inplace=True, существующий DataFrame изменится и sort_values() вернёт None.</p>
202 <p>Необязательный параметр inplace также можно использовать с sort_values(). По умолчанию оно установлено в False, что обеспечивает выдачу нового DataFrame. Когда вы установите inplace=True, существующий DataFrame изменится и sort_values() вернёт None.</p>
203 <p>Если вы когда-нибудь пробовали сортировать значения в Excel, то подход Pandas может показаться вам более эффективным и удобным. Когда у вас есть большие объёмы данных, Pandas значительно превосходит Excel.</p>
203 <p>Если вы когда-нибудь пробовали сортировать значения в Excel, то подход Pandas может показаться вам более эффективным и удобным. Когда у вас есть большие объёмы данных, Pandas значительно превосходит Excel.</p>
204 <p>Фильтрация данных - ещё одна суперспособность Pandas. Она работает аналогично<a>индексации логических массивов в NumPy</a>.</p>
204 <p>Фильтрация данных - ещё одна суперспособность Pandas. Она работает аналогично<a>индексации логических массивов в NumPy</a>.</p>
205 <p>Если применить какую-либо логическую операцию к объекту Series, получится ещё одна серия с логическими значениями True и False:</p>
205 <p>Если применить какую-либо логическую операцию к объекту Series, получится ещё одна серия с логическими значениями True и False:</p>
206 &gt;&gt;&gt; filter_ = df['django-score'] &gt;= 80 &gt;&gt;&gt; filter_ 10 True 11 True 12 False 13 True 14 False 15 False 16 True Name: django-score, dtype: bool<p>В данном случае df['django-score'] &gt;= 80. То есть True присваивается строкам, в которых оценка по Django больше или равна 80, а False -для строк с оценкой Django меньше 80.</p>
206 &gt;&gt;&gt; filter_ = df['django-score'] &gt;= 80 &gt;&gt;&gt; filter_ 10 True 11 True 12 False 13 True 14 False 15 False 16 True Name: django-score, dtype: bool<p>В данном случае df['django-score'] &gt;= 80. То есть True присваивается строкам, в которых оценка по Django больше или равна 80, а False -для строк с оценкой Django меньше 80.</p>
207 <p>Теперь у вас есть серия filter_, заполненная булевыми значениями. Выражение df[filter_] выдаёт Pandas DataFrame со строками df, где в filter_ стоит True:</p>
207 <p>Теперь у вас есть серия filter_, заполненная булевыми значениями. Выражение df[filter_] выдаёт Pandas DataFrame со строками df, где в filter_ стоит True:</p>
208 &gt;&gt;&gt; df[filter_] name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 13 Yi Shanghai 80.0 88.0 79.0 82.1 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Как видите, в filter_[10], filter_[11], filter_[13] и filter_[16] стоит True, а в filter_[12], filter_[14] и filter_[15] - False, поэтому соответствующие строки не появляются в df[filter_].</p>
208 &gt;&gt;&gt; df[filter_] name city py-score django-score js-score total 10 Xavier Mexico City 88.0 86.0 71.0 82.3 11 Ann Toronto 79.0 81.0 95.0 84.4 13 Yi Shanghai 80.0 88.0 79.0 82.1 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Как видите, в filter_[10], filter_[11], filter_[13] и filter_[16] стоит True, а в filter_[12], filter_[14] и filter_[15] - False, поэтому соответствующие строки не появляются в df[filter_].</p>
209 <p>Вы можете создавать сложные выражения, комбинируя логические операции со следующими операторами:</p>
209 <p>Вы можете создавать сложные выражения, комбинируя логические операции со следующими операторами:</p>
210 <ul><li>NOT( ~)</li>
210 <ul><li>NOT( ~)</li>
211 <li>AND( &amp;)</li>
211 <li>AND( &amp;)</li>
212 <li>OR( |)</li>
212 <li>OR( |)</li>
213 <li>XOR( ^)</li>
213 <li>XOR( ^)</li>
214 </ul><p>Например, попробуем получить DataFrame с кандидатами, чьи результаты py-score и js-score больше или равны 80:</p>
214 </ul><p>Например, попробуем получить DataFrame с кандидатами, чьи результаты py-score и js-score больше или равны 80:</p>
215 &gt;&gt;&gt; df[(df['py-score'] &gt;= 80) &amp; (df['js-score'] &gt;= 80)] name city py-score django-score js-score total 12 Jana Prague 81.0 78.0 88.0 82.2 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Выражение (df['py-score'] &gt;= 80) &amp; (df['js-score'] &gt;= 80) задаёт True в строках, где py-score и js-score больше или равны 80, и False - в остальных. В этом случае только строки с метками 12 и 16 удовлетворяют обоим условиям.</p>
215 &gt;&gt;&gt; df[(df['py-score'] &gt;= 80) &amp; (df['js-score'] &gt;= 80)] name city py-score django-score js-score total 12 Jana Prague 81.0 78.0 88.0 82.2 16 Nori Osaka 84.0 81.0 80.0 81.9<p>Выражение (df['py-score'] &gt;= 80) &amp; (df['js-score'] &gt;= 80) задаёт True в строках, где py-score и js-score больше или равны 80, и False - в остальных. В этом случае только строки с метками 12 и 16 удовлетворяют обоим условиям.</p>
216 <p>Для некоторых операций, требующих фильтрации данных, удобнее использовать<a>where()</a>:</p>
216 <p>Для некоторых операций, требующих фильтрации данных, удобнее использовать<a>where()</a>:</p>
217 &gt;&gt;&gt; df['django-score'].where(cond=df['django-score'] &gt;= 80, other=0.0) 10 86.0 11 81.0 12 0.0 13 88.0 14 0.0 15 0.0 16 81.0 Name: django-score, dtype: float64<p>В данном примере условие - df['django-score'] &gt;= 80. Значения DataFrame или Series, которые вызываются, при использовании where() останутся True и будут заменены значением в параметре other (в данном случае 0.0), если условие не выполняется.</p>
217 &gt;&gt;&gt; df['django-score'].where(cond=df['django-score'] &gt;= 80, other=0.0) 10 86.0 11 81.0 12 0.0 13 88.0 14 0.0 15 0.0 16 81.0 Name: django-score, dtype: float64<p>В данном примере условие - df['django-score'] &gt;= 80. Значения DataFrame или Series, которые вызываются, при использовании where() останутся True и будут заменены значением в параметре other (в данном случае 0.0), если условие не выполняется.</p>
218 <p>Pandas предоставляет множество<a>статистических методов</a>для DataFrames. Базовую статистику для числовых столбцов в DataFrame можно получить с помощью метода<a>describe()</a>:</p>
218 <p>Pandas предоставляет множество<a>статистических методов</a>для DataFrames. Базовую статистику для числовых столбцов в DataFrame можно получить с помощью метода<a>describe()</a>:</p>
219 &gt;&gt;&gt; df.describe() py-score django-score js-score total count 7.000000 7.000000 7.000000 7.000000 mean 77.285714 79.714286 85.000000 80.328571 std 9.446592 6.343350 8.544004 4.101510 min 61.000000 70.000000 71.000000 72.700000 25% 73.500000 76.000000 79.500000 79.300000 50% 80.000000 81.000000 88.000000 82.100000 75% 82.500000 83.500000 91.000000 82.250000 max 88.000000 88.000000 95.000000 84.400000<p>В этом примере describe() возвращает новый DataFrame с количеством строк, указанным в count, а также средним значением, стандартным отклонением, минимумом, максимумом и квартилями столбцов.</p>
219 &gt;&gt;&gt; df.describe() py-score django-score js-score total count 7.000000 7.000000 7.000000 7.000000 mean 77.285714 79.714286 85.000000 80.328571 std 9.446592 6.343350 8.544004 4.101510 min 61.000000 70.000000 71.000000 72.700000 25% 73.500000 76.000000 79.500000 79.300000 50% 80.000000 81.000000 88.000000 82.100000 75% 82.500000 83.500000 91.000000 82.250000 max 88.000000 88.000000 95.000000 84.400000<p>В этом примере describe() возвращает новый DataFrame с количеством строк, указанным в count, а также средним значением, стандартным отклонением, минимумом, максимумом и квартилями столбцов.</p>
220 <p>Если вы хотите получить конкретную статистику для некоторых или всех ваших столбцов, можно вызвать такие методы, как<a>mean()</a>или<a>std()</a>:</p>
220 <p>Если вы хотите получить конкретную статистику для некоторых или всех ваших столбцов, можно вызвать такие методы, как<a>mean()</a>или<a>std()</a>:</p>
221 &gt;&gt;&gt; df.mean() py-score 77.285714 django-score 79.714286 js-score 85.000000 total 80.328571 dtype: float64 &gt;&gt;&gt; df['py-score'].mean() 77.28571428571429 &gt;&gt;&gt; df.std() py-score 9.446592 django-score 6.343350 js-score 8.544004 total 4.101510 dtype: float64 &gt;&gt;&gt; df['py-score'].std() 9.446591726019244<p>При применении к Pandas DataFrame эти методы позволяют выдать Series с результатами для каждого столбца. При применении к объекту Series или одному столбцу будут выданы скаляры.</p>
221 &gt;&gt;&gt; df.mean() py-score 77.285714 django-score 79.714286 js-score 85.000000 total 80.328571 dtype: float64 &gt;&gt;&gt; df['py-score'].mean() 77.28571428571429 &gt;&gt;&gt; df.std() py-score 9.446592 django-score 6.343350 js-score 8.544004 total 4.101510 dtype: float64 &gt;&gt;&gt; df['py-score'].std() 9.446591726019244<p>При применении к Pandas DataFrame эти методы позволяют выдать Series с результатами для каждого столбца. При применении к объекту Series или одному столбцу будут выданы скаляры.</p>
222 <p>Узнать больше о статистических вычислениях в Pandas, и ознакомиться с описательной статистикой в Python можно в <a>этой статье</a>. А изучить работу с корреляцией в NumPy, SciPy и Pandas -<a>в этой</a>.</p>
222 <p>Узнать больше о статистических вычислениях в Pandas, и ознакомиться с описательной статистикой в Python можно в <a>этой статье</a>. А изучить работу с корреляцией в NumPy, SciPy и Pandas -<a>в этой</a>.</p>
223 <p>Отсутствующие данные очень распространены в науке о данных и машинном обучении. К счасть, у Pandas есть очень мощные функции для работы с ними. Более того, в его документации есть<a>целый раздел</a>, посвящённый работе с отсутствующими данными.</p>
223 <p>Отсутствующие данные очень распространены в науке о данных и машинном обучении. К счасть, у Pandas есть очень мощные функции для работы с ними. Более того, в его документации есть<a>целый раздел</a>, посвящённый работе с отсутствующими данными.</p>
224 <p>Pandas обычно представляет отсутствующие данные значениями<strong>NaN</strong>(не число). В Python вы можете получить<strong>NaN</strong>с помощью<a>float('nan')</a>,<a>math.nan</a>или<a>numpy.nan</a>. Начиная с Pandas 1.0, используются также<a>BooleanDtype</a>,<a>Int8Dtype</a>,<a>Int16Dtype</a>,<a>Int32Dtype</a>и <a>Int64Dtype</a>. Вот пример работы с отсутствующим значением:</p>
224 <p>Pandas обычно представляет отсутствующие данные значениями<strong>NaN</strong>(не число). В Python вы можете получить<strong>NaN</strong>с помощью<a>float('nan')</a>,<a>math.nan</a>или<a>numpy.nan</a>. Начиная с Pandas 1.0, используются также<a>BooleanDtype</a>,<a>Int8Dtype</a>,<a>Int16Dtype</a>,<a>Int32Dtype</a>и <a>Int64Dtype</a>. Вот пример работы с отсутствующим значением:</p>
225 &gt;&gt;&gt; df_ = pd.DataFrame({'x': [1, 2, np.nan, 4]}) &gt;&gt;&gt; df_ x 0 1.0 1 2.0 2 NaN 3 4.0<p>Переменная df_ относится к DataFrame с одним столбцом x и четырьмя значениями. Третье значение<strong>NaN</strong>по умолчанию считается отсутствующим.</p>
225 &gt;&gt;&gt; df_ = pd.DataFrame({'x': [1, 2, np.nan, 4]}) &gt;&gt;&gt; df_ x 0 1.0 1 2.0 2 NaN 3 4.0<p>Переменная df_ относится к DataFrame с одним столбцом x и четырьмя значениями. Третье значение<strong>NaN</strong>по умолчанию считается отсутствующим.</p>
226 <p>Многие методы Pandas опускают значения<strong>NaN</strong>при выполнении вычислений, если только они явно не указаны:</p>
226 <p>Многие методы Pandas опускают значения<strong>NaN</strong>при выполнении вычислений, если только они явно не указаны:</p>
227 &gt;&gt;&gt; df_.mean() x 2.333333 dtype: float64 &gt;&gt;&gt; df_.mean(skipna=False) x NaN dtype: float64<p>В первом примере df_.mean() вычисляет среднее значение без учёта<strong>NaN</strong>(третьего значения). Он просто принимает 1.0, 2.0 и 4.0 и выдаёт их среднее значение, равное 2.33.</p>
227 &gt;&gt;&gt; df_.mean() x 2.333333 dtype: float64 &gt;&gt;&gt; df_.mean(skipna=False) x NaN dtype: float64<p>В первом примере df_.mean() вычисляет среднее значение без учёта<strong>NaN</strong>(третьего значения). Он просто принимает 1.0, 2.0 и 4.0 и выдаёт их среднее значение, равное 2.33.</p>
228 <p>Однако, если вы с помощью skipna=False прикажете mean() не пропускать<strong>NaN</strong>, то он будет возвращать их там, где отсутствует значение.</p>
228 <p>Однако, если вы с помощью skipna=False прикажете mean() не пропускать<strong>NaN</strong>, то он будет возвращать их там, где отсутствует значение.</p>
229 <p>В Pandas есть несколько способов заполнения или замены отсутствующих значений другими значениями. Один из самых удобных -<a>fillna()</a>. Он позволяет заменять<strong>NaN</strong>на:</p>
229 <p>В Pandas есть несколько способов заполнения или замены отсутствующих значений другими значениями. Один из самых удобных -<a>fillna()</a>. Он позволяет заменять<strong>NaN</strong>на:</p>
230 <ul><li>указанные значения,</li>
230 <ul><li>указанные значения,</li>
231 <li>значение выше пропущенного значения,</li>
231 <li>значение выше пропущенного значения,</li>
232 <li>значение ниже пропущенного значения.</li>
232 <li>значение ниже пропущенного значения.</li>
233 </ul><p>Вот как вы можете применить параметры, упомянутые выше:</p>
233 </ul><p>Вот как вы можете применить параметры, упомянутые выше:</p>
234 &gt;&gt;&gt; df_.fillna(value=0) x 0 1.0 1 2.0 2 0.0 3 4.0 &gt;&gt;&gt; df_.fillna(method='ffill') x 0 1.0 1 2.0 2 2.0 3 4.0 &gt;&gt;&gt; df_.fillna(method='bfill') x 0 1.0 1 2.0 2 4.0 3 4.0<p>В первом примере fillna(value=0) вставляет число 0.0, которое указано в value. Во втором fillna(method='ffill') заменяет отсутствующее значение тем, что расположено над ним, то есть 2.0. А в третьем fillna(method='bfill') вставляет то, что расположено ниже отсутствующего значения, то есть 4.0.</p>
234 &gt;&gt;&gt; df_.fillna(value=0) x 0 1.0 1 2.0 2 0.0 3 4.0 &gt;&gt;&gt; df_.fillna(method='ffill') x 0 1.0 1 2.0 2 2.0 3 4.0 &gt;&gt;&gt; df_.fillna(method='bfill') x 0 1.0 1 2.0 2 4.0 3 4.0<p>В первом примере fillna(value=0) вставляет число 0.0, которое указано в value. Во втором fillna(method='ffill') заменяет отсутствующее значение тем, что расположено над ним, то есть 2.0. А в третьем fillna(method='bfill') вставляет то, что расположено ниже отсутствующего значения, то есть 4.0.</p>
235 <p>Другой популярный вариант - применить<a>интерполяцию</a>и заменить отсутствующие значения интерполированными с помощью<a>interpolate()</a>:</p>
235 <p>Другой популярный вариант - применить<a>интерполяцию</a>и заменить отсутствующие значения интерполированными с помощью<a>interpolate()</a>:</p>
236 &gt;&gt;&gt; df_.interpolate() x 0 1.0 1 2.0 2 3.0 3 4.0<p>Также можно использовать необязательный параметр inplace с fillna(). Это позволит:</p>
236 &gt;&gt;&gt; df_.interpolate() x 0 1.0 1 2.0 2 3.0 3 4.0<p>Также можно использовать необязательный параметр inplace с fillna(). Это позволит:</p>
237 <ul><li>Создавать и возвращать новый DataFrame, когда inplace=False;</li>
237 <ul><li>Создавать и возвращать новый DataFrame, когда inplace=False;</li>
238 <li>Изменять существующий DataFrame на <strong>None</strong>когда inplace=True.</li>
238 <li>Изменять существующий DataFrame на <strong>None</strong>когда inplace=True.</li>
239 </ul><p>По умолчанию параметр inplace равен False. Однако его полезно устанавливать в True, во время работы с большими объёмами данных для предотвращения ненужного и неэффективного копирования.</p>
239 </ul><p>По умолчанию параметр inplace равен False. Однако его полезно устанавливать в True, во время работы с большими объёмами данных для предотвращения ненужного и неэффективного копирования.</p>
240 <p>В некоторых ситуациях может потребоваться удалить строки или даже столбцы, в которых отсутствуют значения. Сделать это можно с помощью<a>dropna()</a>:</p>
240 <p>В некоторых ситуациях может потребоваться удалить строки или даже столбцы, в которых отсутствуют значения. Сделать это можно с помощью<a>dropna()</a>:</p>
241 &gt;&gt;&gt; df_.dropna() x 0 1.0 1 2.0 3 4.0<p>В приведённом выше примере метод dropna() удаляет строку с <strong>NaN</strong>, вместе с её меткой. Он также имеет необязательный параметр inplace, который ведёт себя так же, как .fillna() и .interpolate().</p>
241 &gt;&gt;&gt; df_.dropna() x 0 1.0 1 2.0 3 4.0<p>В приведённом выше примере метод dropna() удаляет строку с <strong>NaN</strong>, вместе с её меткой. Он также имеет необязательный параметр inplace, который ведёт себя так же, как .fillna() и .interpolate().</p>
242 <p>Как мы уже знаем, метки строк и столбцов DataFrame можно получить в виде последовательностей с помощью атрибутов index и columns. Их можно использовать также для перебора меток и получения или установки значений данных. Однако Pandas предоставляет несколько более удобных методов итерации:</p>
242 <p>Как мы уже знаем, метки строк и столбцов DataFrame можно получить в виде последовательностей с помощью атрибутов index и columns. Их можно использовать также для перебора меток и получения или установки значений данных. Однако Pandas предоставляет несколько более удобных методов итерации:</p>
243 <ul><li><a>items()</a> - перебирать столбцы;</li>
243 <ul><li><a>items()</a> - перебирать столбцы;</li>
244 <li><a>iteritems()</a> - перебирать столбцы;</li>
244 <li><a>iteritems()</a> - перебирать столбцы;</li>
245 <li><a>iterrows()</a> - перебирать строки;</li>
245 <li><a>iterrows()</a> - перебирать строки;</li>
246 <li><a>itertuples()</a> - перебирать строки и получать именованные кортежи.</li>
246 <li><a>itertuples()</a> - перебирать строки и получать именованные кортежи.</li>
247 </ul><p>Каждая итерация items() и iteritems() возвращает кортеж с именем и данными столбца в виде объекта Series:</p>
247 </ul><p>Каждая итерация items() и iteritems() возвращает кортеж с именем и данными столбца в виде объекта Series:</p>
248 &gt;&gt;&gt; for col_label, col in df.iteritems(): ... print(col_label, col, sep='\n', end='\n\n') ... name 10 Xavier 11 Ann 12 Jana 13 Yi 14 Robin 15 Amal 16 Nori Name: name, dtype: object city 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object py-score 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64 django-score 10 86.0 11 81.0 12 78.0 13 88.0 14 74.0 15 70.0 16 81.0 Name: django-score, dtype: float64 js-score 10 71.0 11 95.0 12 88.0 13 79.0 14 91.0 15 91.0 16 80.0 Name: js-score, dtype: float64 total 10 82.3 11 84.4 12 82.2 13 82.1 14 76.7 15 72.7 16 81.9 Name: total, dtype: float64<p>Каждая итерация с помощью iterrows() даёт кортеж с именем строки и данными строки в виде серии:</p>
248 &gt;&gt;&gt; for col_label, col in df.iteritems(): ... print(col_label, col, sep='\n', end='\n\n') ... name 10 Xavier 11 Ann 12 Jana 13 Yi 14 Robin 15 Amal 16 Nori Name: name, dtype: object city 10 Mexico City 11 Toronto 12 Prague 13 Shanghai 14 Manchester 15 Cairo 16 Osaka Name: city, dtype: object py-score 10 88.0 11 79.0 12 81.0 13 80.0 14 68.0 15 61.0 16 84.0 Name: py-score, dtype: float64 django-score 10 86.0 11 81.0 12 78.0 13 88.0 14 74.0 15 70.0 16 81.0 Name: django-score, dtype: float64 js-score 10 71.0 11 95.0 12 88.0 13 79.0 14 91.0 15 91.0 16 80.0 Name: js-score, dtype: float64 total 10 82.3 11 84.4 12 82.2 13 82.1 14 76.7 15 72.7 16 81.9 Name: total, dtype: float64<p>Каждая итерация с помощью iterrows() даёт кортеж с именем строки и данными строки в виде серии:</p>
249 &gt;&gt;&gt; for row_label, row in df.iterrows(): ... print(row_label, row, sep='\n', end='\n\n') ... 10 name Xavier city Mexico City py-score 88 django-score 86 js-score 71 total 82.3 Name: 10, dtype: object 11 name Ann city Toronto py-score 79 django-score 81 js-score 95 total 84.4 Name: 11, dtype: object 12 name Jana city Prague py-score 81 django-score 78 js-score 88 total 82.2 Name: 12, dtype: object 13 name Yi city Shanghai py-score 80 django-score 88 js-score 79 total 82.1 Name: 13, dtype: object 14 name Robin city Manchester py-score 68 django-score 74 js-score 91 total 76.7 Name: 14, dtype: object 15 name Amal city Cairo py-score 61 django-score 70 js-score 91 total 72.7 Name: 15, dtype: object 16 name Nori city Osaka py-score 84 django-score 81 js-score 80 total 81.9 Name: 16, dtype: object<p>Точно так же itertuples() перебирает строки и на каждой итерации (опционально) даёт именованный кортеж с индексом и данными:</p>
249 &gt;&gt;&gt; for row_label, row in df.iterrows(): ... print(row_label, row, sep='\n', end='\n\n') ... 10 name Xavier city Mexico City py-score 88 django-score 86 js-score 71 total 82.3 Name: 10, dtype: object 11 name Ann city Toronto py-score 79 django-score 81 js-score 95 total 84.4 Name: 11, dtype: object 12 name Jana city Prague py-score 81 django-score 78 js-score 88 total 82.2 Name: 12, dtype: object 13 name Yi city Shanghai py-score 80 django-score 88 js-score 79 total 82.1 Name: 13, dtype: object 14 name Robin city Manchester py-score 68 django-score 74 js-score 91 total 76.7 Name: 14, dtype: object 15 name Amal city Cairo py-score 61 django-score 70 js-score 91 total 72.7 Name: 15, dtype: object 16 name Nori city Osaka py-score 84 django-score 81 js-score 80 total 81.9 Name: 16, dtype: object<p>Точно так же itertuples() перебирает строки и на каждой итерации (опционально) даёт именованный кортеж с индексом и данными:</p>
250 &gt;&gt;&gt; for row in df.loc[:, ['name', 'city', 'total']].itertuples(): ... print(row) ... Pandas(Index=10, name='Xavier', city='Mexico City', total=82.3) Pandas(Index=11, name='Ann', city='Toronto', total=84.4) Pandas(Index=12, name='Jana', city='Prague', total=82.19999999999999) Pandas(Index=13, name='Yi', city='Shanghai', total=82.1) Pandas(Index=14, name='Robin', city='Manchester', total=76.7) Pandas(Index=15, name='Amal', city='Cairo', total=72.7) Pandas(Index=16, name='Nori', city='Osaka', total=81.9)<p>Имя кортежа устанавливается параметром name. Дополнительно можно указать, включать ли метки строк в index (по умолчанию установлен в True).</p>
250 &gt;&gt;&gt; for row in df.loc[:, ['name', 'city', 'total']].itertuples(): ... print(row) ... Pandas(Index=10, name='Xavier', city='Mexico City', total=82.3) Pandas(Index=11, name='Ann', city='Toronto', total=84.4) Pandas(Index=12, name='Jana', city='Prague', total=82.19999999999999) Pandas(Index=13, name='Yi', city='Shanghai', total=82.1) Pandas(Index=14, name='Robin', city='Manchester', total=76.7) Pandas(Index=15, name='Amal', city='Cairo', total=72.7) Pandas(Index=16, name='Nori', city='Osaka', total=81.9)<p>Имя кортежа устанавливается параметром name. Дополнительно можно указать, включать ли метки строк в index (по умолчанию установлен в True).</p>
251 <p>Pandas отлично справляется с временными рядами. Хотя эта функция частично основана на <a>datetimes и timedeltas</a>, Pandas обеспечивает гораздо большую гибкость.</p>
251 <p>Pandas отлично справляется с временными рядами. Хотя эта функция частично основана на <a>datetimes и timedeltas</a>, Pandas обеспечивает гораздо большую гибкость.</p>
252 <p>Попробуем создать дата-фрейм, используя почасовые данные о температуре за день.</p>
252 <p>Попробуем создать дата-фрейм, используя почасовые данные о температуре за день.</p>
253 <p>Начнём со списка (кортежа, массива NumPy или другого типа данных) со значениями данных, которые будут представлять собой почасовую температуру, указанную в градусах Цельсия:</p>
253 <p>Начнём со списка (кортежа, массива NumPy или другого типа данных) со значениями данных, которые будут представлять собой почасовую температуру, указанную в градусах Цельсия:</p>
254 &gt;&gt;&gt; temp_c = [ 8.0, 7.1, 6.8, 6.4, 6.0, 5.4, 4.8, 5.0, ... 9.1, 12.8, 15.3, 19.1, 21.2, 22.1, 22.4, 23.1, ... 21.0, 17.9, 15.5, 14.4, 11.9, 11.0, 10.2, 9.1]<p>Переменная temp_c ссылается на список значений температуры.</p>
254 &gt;&gt;&gt; temp_c = [ 8.0, 7.1, 6.8, 6.4, 6.0, 5.4, 4.8, 5.0, ... 9.1, 12.8, 15.3, 19.1, 21.2, 22.1, 22.4, 23.1, ... 21.0, 17.9, 15.5, 14.4, 11.9, 11.0, 10.2, 9.1]<p>Переменная temp_c ссылается на список значений температуры.</p>
255 <p>Следующий шаг - создание последовательности дат и времени. Для этого в Pandas есть очень удобная функция<a>date_range()</a>, ранжирующая аргументы, которые вы используете для указания начала или конца диапазона, количества периодов, частоты, часового пояса и так далее:</p>
255 <p>Следующий шаг - создание последовательности дат и времени. Для этого в Pandas есть очень удобная функция<a>date_range()</a>, ранжирующая аргументы, которые вы используете для указания начала или конца диапазона, количества периодов, частоты, часового пояса и так далее:</p>
256 &gt;&gt;&gt; dt = pd.date_range(start='2019-10-27 00:00:00.0', periods=24, ... freq='H') &gt;&gt;&gt; dt DatetimeIndex(['2019-10-27 00:00:00', '2019-10-27 01:00:00', '2019-10-27 02:00:00', '2019-10-27 03:00:00', '2019-10-27 04:00:00', '2019-10-27 05:00:00', '2019-10-27 06:00:00', '2019-10-27 07:00:00', '2019-10-27 08:00:00', '2019-10-27 09:00:00', '2019-10-27 10:00:00', '2019-10-27 11:00:00', '2019-10-27 12:00:00', '2019-10-27 13:00:00', '2019-10-27 14:00:00', '2019-10-27 15:00:00', '2019-10-27 16:00:00', '2019-10-27 17:00:00', '2019-10-27 18:00:00', '2019-10-27 19:00:00', '2019-10-27 20:00:00', '2019-10-27 21:00:00', '2019-10-27 22:00:00', '2019-10-27 23:00:00'], dtype='datetime64[ns]', freq='H')<p>Теперь создадим DataFrame. Во многих случаях удобно использовать значения даты и времени в качестве меток строк:</p>
256 &gt;&gt;&gt; dt = pd.date_range(start='2019-10-27 00:00:00.0', periods=24, ... freq='H') &gt;&gt;&gt; dt DatetimeIndex(['2019-10-27 00:00:00', '2019-10-27 01:00:00', '2019-10-27 02:00:00', '2019-10-27 03:00:00', '2019-10-27 04:00:00', '2019-10-27 05:00:00', '2019-10-27 06:00:00', '2019-10-27 07:00:00', '2019-10-27 08:00:00', '2019-10-27 09:00:00', '2019-10-27 10:00:00', '2019-10-27 11:00:00', '2019-10-27 12:00:00', '2019-10-27 13:00:00', '2019-10-27 14:00:00', '2019-10-27 15:00:00', '2019-10-27 16:00:00', '2019-10-27 17:00:00', '2019-10-27 18:00:00', '2019-10-27 19:00:00', '2019-10-27 20:00:00', '2019-10-27 21:00:00', '2019-10-27 22:00:00', '2019-10-27 23:00:00'], dtype='datetime64[ns]', freq='H')<p>Теперь создадим DataFrame. Во многих случаях удобно использовать значения даты и времени в качестве меток строк:</p>
257 &gt;&gt;&gt; temp = pd.DataFrame(data={'temp_c': temp_c}, index=dt) &gt;&gt;&gt; temp temp_c 2019-10-27 00:00:00 8.0 2019-10-27 01:00:00 7.1 2019-10-27 02:00:00 6.8 2019-10-27 03:00:00 6.4 2019-10-27 04:00:00 6.0 2019-10-27 05:00:00 5.4 2019-10-27 06:00:00 4.8 2019-10-27 07:00:00 5.0 2019-10-27 08:00:00 9.1 2019-10-27 09:00:00 12.8 2019-10-27 10:00:00 15.3 2019-10-27 11:00:00 19.1 2019-10-27 12:00:00 21.2 2019-10-27 13:00:00 22.1 2019-10-27 14:00:00 22.4 2019-10-27 15:00:00 23.1 2019-10-27 16:00:00 21.0 2019-10-27 17:00:00 17.9 2019-10-27 18:00:00 15.5 2019-10-27 19:00:00 14.4 2019-10-27 20:00:00 11.9 2019-10-27 21:00:00 11.0 2019-10-27 22:00:00 10.2 2019-10-27 23:00:00 9.1<p>К DataFrame с данными временных рядов можно применить срезы, чтобы получить только часть информации:</p>
257 &gt;&gt;&gt; temp = pd.DataFrame(data={'temp_c': temp_c}, index=dt) &gt;&gt;&gt; temp temp_c 2019-10-27 00:00:00 8.0 2019-10-27 01:00:00 7.1 2019-10-27 02:00:00 6.8 2019-10-27 03:00:00 6.4 2019-10-27 04:00:00 6.0 2019-10-27 05:00:00 5.4 2019-10-27 06:00:00 4.8 2019-10-27 07:00:00 5.0 2019-10-27 08:00:00 9.1 2019-10-27 09:00:00 12.8 2019-10-27 10:00:00 15.3 2019-10-27 11:00:00 19.1 2019-10-27 12:00:00 21.2 2019-10-27 13:00:00 22.1 2019-10-27 14:00:00 22.4 2019-10-27 15:00:00 23.1 2019-10-27 16:00:00 21.0 2019-10-27 17:00:00 17.9 2019-10-27 18:00:00 15.5 2019-10-27 19:00:00 14.4 2019-10-27 20:00:00 11.9 2019-10-27 21:00:00 11.0 2019-10-27 22:00:00 10.2 2019-10-27 23:00:00 9.1<p>К DataFrame с данными временных рядов можно применить срезы, чтобы получить только часть информации:</p>
258 &gt;&gt;&gt; temp['2019-10-27 05':'2019-10-27 14'] temp_c 2019-10-27 05:00:00 5.4 2019-10-27 06:00:00 4.8 2019-10-27 07:00:00 5.0 2019-10-27 08:00:00 9.1 2019-10-27 09:00:00 12.8 2019-10-27 10:00:00 15.3 2019-10-27 11:00:00 19.1 2019-10-27 12:00:00 21.2 2019-10-27 13:00:00 22.1 2019-10-27 14:00:00 22.4<p>В этом примере показано, как извлечь значения температуры между 05:00 и 14:00. Pandas понимает, что метки строк - это значения даты и времени, и соответственно их интерпретирует.</p>
258 &gt;&gt;&gt; temp['2019-10-27 05':'2019-10-27 14'] temp_c 2019-10-27 05:00:00 5.4 2019-10-27 06:00:00 4.8 2019-10-27 07:00:00 5.0 2019-10-27 08:00:00 9.1 2019-10-27 09:00:00 12.8 2019-10-27 10:00:00 15.3 2019-10-27 11:00:00 19.1 2019-10-27 12:00:00 21.2 2019-10-27 13:00:00 22.1 2019-10-27 14:00:00 22.4<p>В этом примере показано, как извлечь значения температуры между 05:00 и 14:00. Pandas понимает, что метки строк - это значения даты и времени, и соответственно их интерпретирует.</p>
259 <p>Если вы хотите разбить день на четыре шестичасовых интервала и получить среднюю температуру для каждого из них, в Pandas есть метод<a>resample()</a>, который можно комбинировать с другими, например с mean():</p>
259 <p>Если вы хотите разбить день на четыре шестичасовых интервала и получить среднюю температуру для каждого из них, в Pandas есть метод<a>resample()</a>, который можно комбинировать с другими, например с mean():</p>
260 &gt;&gt;&gt; temp.resample(rule='6h').mean() temp_c 2019-10-27 00:00:00 6.616667 2019-10-27 06:00:00 11.016667 2019-10-27 12:00:00 21.283333 2019-10-27 18:00:00 12.016667<p>Каждая строка соответствует одному шестичасовому интервалу. Например, значение 6.616667 представляет собой среднее значение первых шести температур из дата-фрейма temp, тогда как 12.016667 - среднее значение последних шести значений температуры.</p>
260 &gt;&gt;&gt; temp.resample(rule='6h').mean() temp_c 2019-10-27 00:00:00 6.616667 2019-10-27 06:00:00 11.016667 2019-10-27 12:00:00 21.283333 2019-10-27 18:00:00 12.016667<p>Каждая строка соответствует одному шестичасовому интервалу. Например, значение 6.616667 представляет собой среднее значение первых шести температур из дата-фрейма temp, тогда как 12.016667 - среднее значение последних шести значений температуры.</p>
261 <p>Вместо mean() можно применить min() или max(). Аналогично можно использовать sum() для получения сумм значений данных. Вы можете свернуть окно, выбрав другой набор смежных строк для вычислений.</p>
261 <p>Вместо mean() можно применить min() или max(). Аналогично можно использовать sum() для получения сумм значений данных. Вы можете свернуть окно, выбрав другой набор смежных строк для вычислений.</p>
262 <p>Первое окно начинается с первой строки в DataFrame и включает столько смежных строк, сколько вы укажете. Затем можно переместить окно вниз на одну строку, опуская первую строку и добавляя ту, которая идёт сразу после последней, и снова вычислить ту же статистику. Процесс нужно повторять, пока вы не дойдёте до последней строки DataFrame. Для этого в Pandas есть метод<a>rolling()</a>:</p>
262 <p>Первое окно начинается с первой строки в DataFrame и включает столько смежных строк, сколько вы укажете. Затем можно переместить окно вниз на одну строку, опуская первую строку и добавляя ту, которая идёт сразу после последней, и снова вычислить ту же статистику. Процесс нужно повторять, пока вы не дойдёте до последней строки DataFrame. Для этого в Pandas есть метод<a>rolling()</a>:</p>
263 &gt;&gt;&gt; temp.rolling(window=3).mean() temp_c 2019-10-27 00:00:00 NaN 2019-10-27 01:00:00 NaN 2019-10-27 02:00:00 7.300000 2019-10-27 03:00:00 6.766667 2019-10-27 04:00:00 6.400000 2019-10-27 05:00:00 5.933333 2019-10-27 06:00:00 5.400000 2019-10-27 07:00:00 5.066667 2019-10-27 08:00:00 6.300000 2019-10-27 09:00:00 8.966667 2019-10-27 10:00:00 12.400000 2019-10-27 11:00:00 15.733333 2019-10-27 12:00:00 18.533333 2019-10-27 13:00:00 20.800000 2019-10-27 14:00:00 21.900000 2019-10-27 15:00:00 22.533333 2019-10-27 16:00:00 22.166667 2019-10-27 17:00:00 20.666667 2019-10-27 18:00:00 18.133333 2019-10-27 19:00:00 15.933333 2019-10-27 20:00:00 13.933333 2019-10-27 21:00:00 12.433333 2019-10-27 22:00:00 11.033333 2019-10-27 23:00:00 10.100000<p>Параметр window определяет размер скользящего временного окна.</p>
263 &gt;&gt;&gt; temp.rolling(window=3).mean() temp_c 2019-10-27 00:00:00 NaN 2019-10-27 01:00:00 NaN 2019-10-27 02:00:00 7.300000 2019-10-27 03:00:00 6.766667 2019-10-27 04:00:00 6.400000 2019-10-27 05:00:00 5.933333 2019-10-27 06:00:00 5.400000 2019-10-27 07:00:00 5.066667 2019-10-27 08:00:00 6.300000 2019-10-27 09:00:00 8.966667 2019-10-27 10:00:00 12.400000 2019-10-27 11:00:00 15.733333 2019-10-27 12:00:00 18.533333 2019-10-27 13:00:00 20.800000 2019-10-27 14:00:00 21.900000 2019-10-27 15:00:00 22.533333 2019-10-27 16:00:00 22.166667 2019-10-27 17:00:00 20.666667 2019-10-27 18:00:00 18.133333 2019-10-27 19:00:00 15.933333 2019-10-27 20:00:00 13.933333 2019-10-27 21:00:00 12.433333 2019-10-27 22:00:00 11.033333 2019-10-27 23:00:00 10.100000<p>Параметр window определяет размер скользящего временного окна.</p>
264 <p>В приведённом выше примере третье значение (7.3) представляет собой среднюю температуру за первые три часа (00:00:00, 01:00:00 и 02:00:00). Четвёртое - среднюю температуру за часы 02:00:00, 03:00:00 и 04:00:00. Последнее - среднюю температуру за последние три часа, 21:00:00, 22:00:00 и 23:00:00. Первые два значения отсутствуют, так как для их вычисления не хватило данных.</p>
264 <p>В приведённом выше примере третье значение (7.3) представляет собой среднюю температуру за первые три часа (00:00:00, 01:00:00 и 02:00:00). Четвёртое - среднюю температуру за часы 02:00:00, 03:00:00 и 04:00:00. Последнее - среднюю температуру за последние три часа, 21:00:00, 22:00:00 и 23:00:00. Первые два значения отсутствуют, так как для их вычисления не хватило данных.</p>
265 <p>Pandas позволяет визуализировать данные или создавать графики на основе DataFrames с использованием Matplotlib в фоновом режиме, поэтому построение графиков в Pandas очень похоже на работу с Matplotlib.</p>
265 <p>Pandas позволяет визуализировать данные или создавать графики на основе DataFrames с использованием Matplotlib в фоновом режиме, поэтому построение графиков в Pandas очень похоже на работу с Matplotlib.</p>
266 <p>Для работы с графиками сначала нужно импортировать модуль<strong>matplotlib.pyplot</strong>:</p>
266 <p>Для работы с графиками сначала нужно импортировать модуль<strong>matplotlib.pyplot</strong>:</p>
267 &gt;&gt;&gt; import matplotlib.pyplot as plt<p>Теперь вы можете создавать графики с <a>Pandas.DataFrame.plot()</a>и визуализировать их с <a>plt.show()</a>:</p>
267 &gt;&gt;&gt; import matplotlib.pyplot as plt<p>Теперь вы можете создавать графики с <a>Pandas.DataFrame.plot()</a>и визуализировать их с <a>plt.show()</a>:</p>
268 &gt;&gt;&gt; temp.plot() &lt;matplotlib.axes._subplots.AxesSubplot object at 0x7f070cd9d950&gt; &gt;&gt;&gt; plt.show()<p>Команда plot() отображает объект<strong>plot</strong>, который выглядит так:</p>
268 &gt;&gt;&gt; temp.plot() &lt;matplotlib.axes._subplots.AxesSubplot object at 0x7f070cd9d950&gt; &gt;&gt;&gt; plt.show()<p>Команда plot() отображает объект<strong>plot</strong>, который выглядит так:</p>
269 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Тот же результат можно получить, применив<a>plot.line()</a>. У plot() и plot.line() есть много необязательных параметров, которые позволяют указать внешний вид графика.</p>
269 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Тот же результат можно получить, применив<a>plot.line()</a>. У plot() и plot.line() есть много необязательных параметров, которые позволяют указать внешний вид графика.</p>
270 <p>Для сохранения изображения используется объединённая команда get_figure()<a>.savefig()</a>:</p>
270 <p>Для сохранения изображения используется объединённая команда get_figure()<a>.savefig()</a>:</p>
271 &gt;&gt;&gt; temp.plot().get_figure().savefig('temperatures.png')<p>В результате график сохраняется в рабочем каталоге как файл temperatures.png.</p>
271 &gt;&gt;&gt; temp.plot().get_figure().savefig('temperatures.png')<p>В результате график сохраняется в рабочем каталоге как файл temperatures.png.</p>
272 <p>Pandas DataFrame позволяет создавать<a>разные типы графиков</a>. Например, с помощью<a>plot.hist()</a>можно визуализировать данные кандидатов в виде гистограммы:</p>
272 <p>Pandas DataFrame позволяет создавать<a>разные типы графиков</a>. Например, с помощью<a>plot.hist()</a>можно визуализировать данные кандидатов в виде гистограммы:</p>
273 &gt;&gt;&gt; df.loc[:, ['py-score', 'total']].plot.hist(bins=5, alpha=0.4) &lt;matplotlib.axes._subplots.AxesSubplot object at 0x7f070c69edd0&gt; &gt;&gt;&gt; plt.show()<p>Выглядит это так:</p>
273 &gt;&gt;&gt; df.loc[:, ['py-score', 'total']].plot.hist(bins=5, alpha=0.4) &lt;matplotlib.axes._subplots.AxesSubplot object at 0x7f070c69edd0&gt; &gt;&gt;&gt; plt.show()<p>Выглядит это так:</p>
274 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Настроить детали можно с помощью дополнительных методов и параметров: plot.hist(), plt.rcParams и многих других. Более подробную информацию вы найдёте в бесплатном учебнике<a>Anatomy of Matplotlib</a>.</p>
274 <em>Инфографика: Катя Павловская для Skillbox Media</em><p>Настроить детали можно с помощью дополнительных методов и параметров: plot.hist(), plt.rcParams и многих других. Более подробную информацию вы найдёте в бесплатном учебнике<a>Anatomy of Matplotlib</a>.</p>
275 <p>Pandas DataFrames - это очень многофункциональные объекты, которые поддерживают многие операции, не упомянутые в этой статье:</p>
275 <p>Pandas DataFrames - это очень многофункциональные объекты, которые поддерживают многие операции, не упомянутые в этой статье:</p>
276 <ul><li><a>Иерархическую (многоуровневую) индексацию</a>;</li>
276 <ul><li><a>Иерархическую (многоуровневую) индексацию</a>;</li>
277 <li><a>Группировку</a>;</li>
277 <li><a>Группировку</a>;</li>
278 <li><a>Слияние, объединение и конкатенацию</a>;</li>
278 <li><a>Слияние, объединение и конкатенацию</a>;</li>
279 <li><a>Работу с категориальными данными</a>.</li>
279 <li><a>Работу с категориальными данными</a>.</li>
280 </ul><p>Большинство доступных опций хорошо описано в официальном<a>учебнике по Pandas</a>. Если вы хотите узнать больше, можно ознакомиться со следующими руководствами (все они написаны на английском языке):</p>
280 </ul><p>Большинство доступных опций хорошо описано в официальном<a>учебнике по Pandas</a>. Если вы хотите узнать больше, можно ознакомиться со следующими руководствами (все они написаны на английском языке):</p>
281 <ul><li><a>Очистка данных в Pandas и NumPy</a>;</li>
281 <ul><li><a>Очистка данных в Pandas и NumPy</a>;</li>
282 <li><a>Pandas DataFrames 101</a>;</li>
282 <li><a>Pandas DataFrames 101</a>;</li>
283 <li><a>Знакомство с Pandas и Vincent</a>;</li>
283 <li><a>Знакомство с Pandas и Vincent</a>;</li>
284 <li><a>Python Pandas: приёмы и возможности, о которых вы могли не знать</a>;</li>
284 <li><a>Python Pandas: приёмы и возможности, о которых вы могли не знать</a>;</li>
285 <li><a>Идиоматические Pandas: приёмы и возможности, о которых вы могли не знать</a>;</li>
285 <li><a>Идиоматические Pandas: приёмы и возможности, о которых вы могли не знать</a>;</li>
286 <li><a>Чтение CSV в Pandas</a>;</li>
286 <li><a>Чтение CSV в Pandas</a>;</li>
287 <li><a>Написание CSV в Pandas</a>;</li>
287 <li><a>Написание CSV в Pandas</a>;</li>
288 <li><a>Чтение и запись файлов CSV в Python</a>;</li>
288 <li><a>Чтение и запись файлов CSV в Python</a>;</li>
289 <li><a>Чтение и запись файлов CSV</a>;</li>
289 <li><a>Чтение и запись файлов CSV</a>;</li>
290 <li><a>Использование Pandas для чтения больших файлов Excel в Python</a>;</li>
290 <li><a>Использование Pandas для чтения больших файлов Excel в Python</a>;</li>
291 <li><a>Быстро, гибко, просто и интуитивно понятно: как ускорить ваши проекты в Pandas</a>.</li>
291 <li><a>Быстро, гибко, просто и интуитивно понятно: как ускорить ваши проекты в Pandas</a>.</li>
292 </ul><p>Если вам нужно работать данными более чем в двух измерениях, можно использовать<a>Xarray</a> - ещё одну мощную библиотеку Python, очень похожую на Pandas.</p>
292 </ul><p>Если вам нужно работать данными более чем в двух измерениях, можно использовать<a>Xarray</a> - ещё одну мощную библиотеку Python, очень похожую на Pandas.</p>
293 <p>Для работы с большими объёмами данных есть также<a>DataFrame API</a>в Dask.</p>
293 <p>Для работы с большими объёмами данных есть также<a>DataFrame API</a>в Dask.</p>
294 <p>Из этого гайда вы узнали:</p>
294 <p>Из этого гайда вы узнали:</p>
295 <ul><li>Что такое Pandas DataFrame и как его создать.</li>
295 <ul><li>Что такое Pandas DataFrame и как его создать.</li>
296 <li>Как получить доступ, изменить, добавить, отсортировать, отфильтровать и удалить данные.</li>
296 <li>Как получить доступ, изменить, добавить, отсортировать, отфильтровать и удалить данные.</li>
297 <li>Как использовать подпрограммы NumPy с DataFrames.</li>
297 <li>Как использовать подпрограммы NumPy с DataFrames.</li>
298 <li>Как обрабатывать пропущенные значения.</li>
298 <li>Как обрабатывать пропущенные значения.</li>
299 <li>Как работать с данными временных рядов.</li>
299 <li>Как работать с данными временных рядов.</li>
300 <li>Как визуализировать данные, содержащиеся в DataFrames.</li>
300 <li>Как визуализировать данные, содержащиеся в DataFrames.</li>
301 </ul><p>Если хотите глубже изучить работу с данными в Python, ознакомьтесь с другими <a>руководствами по Pandas</a>на сайте Real Python.</p>
301 </ul><p>Если хотите глубже изучить работу с данными в Python, ознакомьтесь с другими <a>руководствами по Pandas</a>на сайте Real Python.</p>
302 <p>Python для всех</p>
302 <p>Python для всех</p>
303 <p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
303 <p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
304 <p><a>Пройти бесплатно</a></p>
304 <p><a>Пройти бесплатно</a></p>
305 <a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
305 <a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>