Индексирование и сегментация массивов в Python
Для одномерных коллекций array применяются, операции сегментации и индексирования, описанные в разделе «Сегментация последовательностей в Python». Ниже разберем сегментацию с двумерными коллекциями array.
Выбор элемента двумерной коллекции array
Для выбора элемента двумерной коллекции array укажите кортеж с индексами строки и столбца элемента в квадратных скобках.
>>> import numpy as np
>>> grades = np.array(, , , ])
>>> gradesarray(,
,
,
])
>>> grades # строка 1, столбец 2
4
Выбор подмножества строк двумерной коллекции array
Для выбора одной строки укажите в квадратных скобках только один индекс:
>>> gradesarray()
Для выбора нескольких строк используйте синтаксис сегмента:
>>> gradesarray(,
])
Для выбора нескольких несмежных строк используйте список индексов строк:
>>> grades]array(,
])
Выбор подмножества столбцов двумерной коллекции array
Для выбора подмножества столбцов следует указать кортеж, в котором указаны выбираемые строки и столбцы:
>>> gradesarray()
Двоеточие указывает какие строки в столбце должны выбираться. В нашем случает » » является сегментом и выбираются все строки. После запятой мы указали 1, значит выбрали столбец номер два.
Для выбора нескольких смежных столбцов используется синтаксис сегмента:
>>> gradesarray(,
,
,
])
Для выбора конкретных столбцов используйте список индексов этих строк:
>>> grades]array(,
,
,
])
Пример Pandas Groupby ()
Допустим, у нас есть файл CSV с контентом ниже.
ID,Name,Role,Salary 1,Pankaj,Editor,10000 2,Lisa,Editor,8000 3,David,Author,6000 4,Ram,Author,4000 5,Anupam,Author,5000
Мы будем использовать функцию Pandas Read_CSV (), чтобы прочитать файл CSV и создать объект DataFrame.
import pandas as pd df = pd.read_csv('records.csv') print(df)
Выход:
ID Name Role Salary 0 1 Pankaj Editor 10000 1 2 Lisa Editor 8000 2 3 David Author 6000 3 4 Ram Author 4000 4 5 Anupam Author 5000
4.1) Средняя группа заработной платы по роли
Мы хотим узнать среднюю зарплату сотрудников на основе их роли. Таким образом, мы будем использовать функцию Groupby () для создания групп на основе «роли» столбца. Затем вызовите среднюю функцию совокупности (), чтобы рассчитать среднее и получить результат. Поскольку нам не нужны столбцы ID и имени, мы удалим их с вывода.
df_groupby_role = df.groupby() # select only required columns df_groupby_role = df_groupby_role] # get the average df_groupby_role_mean = df_groupby_role.mean() print(df_groupby_role_mean)
Выход:
Salary Role Author 5000 Editor 9000
Индексы на выходе не выглядят хорошо. Мы можем исправить это, вызывая функцию RESET_INDEX ().
df_groupby_role_mean = df_groupby_role_mean.reset_index() print(df_groupby_role_mean)
Выход:
Role Salary 0 Author 5000 1 Editor 9000
4.2) Общая зарплата, выплаченная ролью
В этом примере мы рассчитаем зарплату, выплаченную за каждую роль.
df_salary_by_role = df.groupby()].sum().reset_index() print(df_salary_by_role)
Выход:
Role Salary 0 Author 15000 1 Editor 18000
Этот пример выглядит просто, потому что все сделано в одной строке. В предыдущем примере я разделил шаги для ясности.
4.3) Общее количество сотрудников по роли
Мы можем использовать совокупную функцию размера (), чтобы получить эти данные.
df_size_by_role = df.groupby().size().reset_index() df_size_by_role.columns.values = 'Count' # renaming the size column print(df_size_by_role)
Выход:
Role Count 0 Author 3 1 Editor 2
Удаление строк и столбцов из DataFrame
Панды DataFrameпредоставляет несколько способов удаления строк и столбцов. Не существует функциональных штрафов за выбор одного над другим. Вы можете использовать любой синтаксис, который вам удобен.
Использование словарного синтаксиса → Чтобы удалить столбец, мы будем использоватькак
del df
С помощьюФункция → Позволяет нам удалять столбцы, а также строки
Будем ли мы удалять строки или столбцы, решается вторым аргументом вфункция.
# Delete Column "age"df.drop('age',1)# Delete the Row with Index "3"df.drop(3,0)
# Delete Columns "name" & "age"df.drop(,1)# Delete Rows with index "2","3", & "4"df.drop(,0)
Как создать Pandas DataFrame?
В реальном миреPanda DataFrameбудет создан путем загрузки наборов данных из постоянного хранилища, включая, помимо прочего, базы данных excel, csv и MySQL.
Как показано на листе Excel выше, если мы рассматриваем имена столбцов как«Ключи»и список предметов под этим столбцом как»Значения»мы можем легко использовать словарь Python для представления так же, как
my_dict = { 'name' : , 'age' : , 'designation': }
Мы можем создатьПанды DataFrameиз этого словаря как
import Pandas as pddf = pd.DataFrame(my_dict)
Результирующий DataFrame должен выглядеть аналогично тому, что мы видели на листе Excel выше, как
Результат -> df = pd.DataFrame (my_dict)
Создание DataFrame Pandas из списка
Что если мы получим набор данных без каких-либо столбцов?
Что ж,Панды DataFrameне обращайте на это внимания и генерируйте DataFrame, неявно добавляя для нас индекс строки и заголовки столбцов.
Например, если мы создадим DataFrame из списка ниже
my_list = , , , , ]df = pd.DataFrame(my_list)
Это будет выглядеть так
df = pd.DataFrame (my_list)
Если мы не хотимПанды DataFrameчтобы автоматически генерировать индексы строк и имена столбцов, мы можем передать их вфункционировать как
df = pd.DataFrame(my_list, index = , columns = )
А вот как это будет выглядеть
df с предоставленной строкой и столбцом
Следует отметить, что мы также можем создать Pandas DataFrame из массивов NumPy как
Изменение размеров и транспонирование массива в Python
В NumPy существует много возможностей для изменения размера массивов.
8.1. Метод resize
Метод resize изменяет размер исходной коллекции array:
>>> import numpy as np
>>> numbers = np.array()
>>> numbersarray()
>>> numbers.resize(3, 2)
>>> numbersarray(,
,
])
8.2. Методы flatten и ravel
Метод flatten выполняет глубокое копирование данных исходной коллекции
>>> import numpy as np
>>> numbers = np.array()
>>> numbers_fl = numbers.flatten()
>>> numbers_flarray()
Чтобы проверить что numbers и numbers_fl не используют общие данные изменим элемент numbers_fl и выведем оба массива:
>>> numbers_fl[] = 77
>>> numbers_flarray()
>>> numbersarray()
Значение в numbers_fl изменилось, значит массивы уже не связаны между собой.
метод ravel создает представление (поверхностную копию) исходной коллекции array, которое использует общие данные.
>>> numbersarray()
>>> numbers_ra = numbers.ravel()
>>> numbers_raarray()
Чтобы проверить использование общих данных, изменим один элемент numbers_ra:
>>> numbers_ra[] =125
>>> numbers_raarray()
>>> numbersarray()
В результате значения поменялись в обоих массивах.
8.3. Транспонирование строк и столбцов
С помощью атрибута T вы можете быстро транспонировать строки и столбцы маcсива, то есть сделать так чтобы строки стали столбцами, а столбцы строками.
>>> import numpy as np
>>> numbers = np.array(, ])
>>> numbersarray(,
])
>>> numbers.Tarray(,
,
])
Транспонирование не изменяет исходную коллекцию array.
8.4. Горизонтальное и вертикальное дополнение. Функции hstack и vstack
Добавление новых строк или столбцов, называется горизонтальным или вертикальным дополнением. Допустим у нас есть две коллекции array, и мы хотим объединить их в одну. Для этого можно воспользоваться функцией hstack() из библиотеки NumPy. Функцие hstack() передается кортеж с объединяемыми коллекциями:
>>> import numpy as np
>>> numbers_1 = np.array()
>>> numbers_2 = np.array()
>>> np.hstack((numbers_1, numbers_2))array()
В случае если нам требуется объединить массивы добавлением, можно воспользоваться функцией vstack():
>>> np.vstack((numbers_1, numbers_2))array(,
])
Please enable JavaScript to view the comments powered by Disqus.
Нан в Numpy
Давайте посмотрим, как работает NAN под Numpy. Для наблюдения за свойствами NAN давайте создадим NAN-массив с значениями NAN.
import numpy as np arr = np.array() pritn(arr)
Выход:
1. Математические операции на NaMy Array с NAN
Давайте попробуем вызвать некоторые основные функции на Numpy Array.
print(arr.sum())
Выход:
nan
Давайте попробуйте найти максимум от массива:
print(arr.max())
Выход:
nan
К счастью, Numpy предлагает методы, которые игнорируют значения NAN при выполнении математических операций.
2. Как игнорировать значения NAN при выполнении математических операций на Numpy Array
Numpy предлагает вам методы, такие как NP.NANSUM () и NP.NANMAX (), чтобы рассчитать сумму и MAX после игнорирования значений NAN в массиве.
np.nansum(arr)
Выход:
19.0
np.nanmax(arr)
6.0
Если у вас есть автозаполнение в своей IDE, вы увидите следующий список опций во время работы с NP.NAN:
3. Проверка значений NAN
Чтобы проверить значения NAN в NAMPY MARY, вы можете использовать метод NP.ISNAN ().
Это выводит логическую маску размера, которая из исходного массива.
np.isnan(arr)
Выход:
Выходной массив имеет True для индексов, которые являются Nans в исходном массиве и ложь для остальных.
4. Приравнять два нанда
Две назы, равные друг другу?
Это может быть запутанным вопросом. Давайте попробуем ответить на него, запустив код Python.
a = np.nan b = np.nan
Эти два утверждения инициализируют две переменные, A и B с NAN. Попробуем приравнивать два.
a == b
Выход:
False
В Python у нас также есть это оператор. Давайте попробуем использовать это, чтобы сравнить две переменные.
a is b
Выход:
True
Причина этого является то, что сравнивает значения как операндов, так и проверки на равенство стоимости. С другой стороны, проверяет ли оба операнды к одному и тому же объекту или нет.
На самом деле, вы можете распечатать идентификаторы как A и B и увидеть, что они относятся к одному и тому же объекту.
id(a)
Выход:
139836725842784
id(b)
Выход:
139836725842784
Numpy и Pandas — лучшие друзья Data Scienctist’а
На практике при решении задач Data Science и Machine Learning приходится работать с обеими рассмотренными библиотеками, т.к. они позволяют быстро и просто обрабатывать большие объемы данных. Даже на онлайн-площадке соревнований по машинному обучению Kaggle обычно первые строчки кода программистов начинаются с , а ниже можно увидеть операцию чтения датасета — . Действительно, в первую очередь необходимо взглянуть на датасет, проанализировать его, построить необходимые графики. Здесь и нужен Pandas.
NumPy, в свою очередь, используется практически в везде, включая другие библиотеки Python, связанные с Data Science и Machine Learning. Например, уже упомянутый Pandas, Seaborn, Statsmodel, в анализе сигналов — Scipy, PyWavelets, в обработке изображений — Scikit-learn и OpenCV, в симуляции моделей — PyDSTool, в глубоком обучении — Keras . Таким образом, эти простые библиотеки являются фундаментом Data Science в Python.
В следующей статье мы продолжим разговор о библиотеках машинного обучения и рассмотрим четыре самых востребованных из них по версии Kaggle. А практические навыки работы с NumPy и Pandas вы получите на курсах по Python в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.
Смотреть расписание
Записаться на курс
Источники
Использование только с условием
В отношении приведенного выше кода может возникнуть некоторая путаница, поскольку некоторые из вас могут подумать, что более интуитивно понятным способом было бы просто написать условие следующим образом:
import random import numpy as np a = np.random.randn(2, 3) b = np.where(a > 0) print(b)
Если вы сейчас попытаетесь запустить приведенный выше код, с этим изменением вы получите следующий результат:
(array(), array())
Если вы внимательно посмотрите, b теперь представляет собой кортеж из множества массивов. И в каждом массиве находится положительный элемент. Что это значит? Всякий раз, когда мы предоставляем только условие, эта функция фактически эквивалентна np.asarray.nonzero().
В нашем примере np.asarray (a> 0) вернет логический массив после применения условия, а np.nonzero (arr_like) вернет индексы ненулевых элементов arr_like.
Рассмотрим более простой пример:
import numpy as np a = np.arange(10) b = np.where(a < 5, a, a * 10) print(a) print(b)
Здесь условием является <5, что будет массивом типа numpy , x – это массив a, а y – массив a * 10. Итак, мы выбираем из только если a <5, и от a * 10, если a> 5.
Таким образом, все элементы> = 5 преобразуются путем умножения на 10. Это действительно то, что мы получаем!
Метод 1: использование astype()
DataFrame.astype() приводит этот DataFrame к указанному типу данных. Ниже приводится синтаксис метода.
astype(dtype, copy=True, errors='raise', **kwargs)
Нас интересует только первый аргумент dtype – это тип данных или dict имени столбца.
Итак, давайте использовать метод astype() с аргументом dtype, чтобы изменить тип данных одного или нескольких столбцов DataFrame.
Как изменить тип данных одного столбца?
Давайте сначала начнем с изменения типа данных только для одного столбца.
В следующей программе мы изменим тип данных столбца a на float.
import pandas as pd import numpy as np #initialize a dataframe df = pd.DataFrame( , , , ], columns=) print('Previous Datatypes\n', df.dtypes, sep='') #change datatype of column df = df.astype({'a': np.float}) #print results print('\nNew Datatypes\n', df.dtypes, sep='') print('\nDataFrame\n', df, sep='')
Вывод:
Previous Datatypes a int64 b int64 c int64 dtype: object New Datatypes a float64 b int64 c int64 dtype: object DataFrame a b c 0 21.0 72 67 1 23.0 78 62 2 32.0 74 54 3 52.0 54 76
Как изменить тип данных нескольких столбцов?
Теперь давайте изменим тип данных более чем для одного столбца. Все, что нам нужно сделать, это предоставить больше пар column_name: datatype key:value в аргументе метода astype().
В следующей программе мы изменим тип данных столбца a на float, а b на int8.
import pandas as pd import numpy as np #initialize a dataframe df = pd.DataFrame( , , , ], columns=) print('Previous Datatypes\n', df.dtypes, sep='') #change datatype of column df = df.astype({'a': np.float, 'b': np.int8}) #print results print('\nNew Datatypes\n', df.dtypes, sep='') print('\nDataFrame\n', df, sep='')
Вывод:
Previous Datatypes a int64 b int64 c int64 dtype: object New Datatypes a float64 b int8 c int64 dtype: object DataFrame a b c 0 21.0 72 67 1 23.0 78 62 2 32.0 74 54 3 52.0 54 76
Как изменить тип данных всех столбцов?
Если вы хотите изменить тип данных всех столбцов DataFrame, вы можете просто передать этот тип данных в качестве аргумента методу astype() без словаря.
В следующей программе мы изменим тип данных всех столбцов на float.
import pandas as pd import numpy as np #initialize a dataframe df = pd.DataFrame( , , , ], columns=) print('Previous Datatypes\n', df.dtypes, sep='') #change datatype of column df = df.astype(np.float) #print results print('\nNew Datatypes\n', df.dtypes, sep='') print('\nDataFrame\n', df, sep='')
Вывод:
Previous Datatypes a int64 b int64 c int64 dtype: object New Datatypes a float64 b float64 c float64 dtype: object DataFrame a b c 0 21.0 72.0 67.0 1 23.0 78.0 62.0 2 32.0 74.0 54.0 3 52.0 54.0 76.0
Dataframe loc [] примеры
Давайте посмотрим на некоторые примеры использования атрибута объекта DataFrame. Но, во-первых, мы создадим образец DataFrame для нас для использования.
import pandas as pd d1 = {'Name': , 'ID': , 'Role': } df = pd.DataFrame(d1) print('DataFrame:\n', df)
Выход:
DataFrame: Name ID Role 0 John 1 CEO 1 Jane 2 CTO 2 Mary 3 CFO
1. loc [] с одной этикеткой
row_1_series = df.loc print(type(row_1_series)) print(df.loc)
Выход:
Name Jane ID 2 Role CTO Name: 1, dtype: object
row_0_2_df = df.loc] print(type(row_0_2_df)) print(row_0_2_df)
Выход:
Name ID Role 0 John 1 CEO 2 Mary 3 CFO
3. Получение единого значения
Мы можем указать этикетки строки и столбцов, чтобы получить одно значение из объекта DataFrame.
jane_role = df.loc print(jane_role) # CTO
4. Ломтик с LOC []
Мы также можем передавать ломтик этикеток в том случае, в этом случае этикетки начала и остановки будут включены в объект серии результатов.
roles = df.loc print(roles)
Выход:
0 CEO 1 CTO Name: Role, dtype: object
5. loc [] С массивом логических ценностей
row_1_series = df.loc] print(row_1_series)
Выход:
Name ID Role 1 Jane 2 CTO
Поскольку содержит DataFrame 3 строк, длина массива должна быть 3. Если аргумент логической длины массива не совпадает с длиной оси, IndexError: вещь неправильная длина Поднялся.
6. LOC [] с условными утверждениями
data = df.loc > 1] print(data)
Выход : DataFrame строк, где идентификатор больше 1.
Name ID Role 1 Jane 2 CTO 2 Mary 3 CFO
7. DataFrame LOC [] с Callable Function
Мы также можем использовать функцию лямбда с атрибутом dataframe loc [].
id_2_row = df.loc == 2] print(id_2_row)
Выход:
Name ID Role 1 Jane 2 CTO