Как применить функцию к выбранным столбцам в Pandas
Вы можете использовать следующий синтаксис, чтобы применить функцию к одному или нескольким столбцам pandas DataFame:
#divide values in *column1* by 2 df['column1'] = df['column1'] / 2 #divide values in *column1* and *column2* by 2 df[['column1', 'column2']] = df[['column1', 'column2']] / 2 #divide values in every column of DataFrame by 2 df = df / 2
В следующих примерах показано, как использовать этот синтаксис на практике.
Пример 1. Применение функции к одному столбцу
В следующем коде показано, как применить функцию только к одному столбцу DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df points rebounds assists 0 10 7 11 1 12 7 8 2 12 8 10 3 14 13 6 4 13 7 6 5 18 4 5 #divide values in *points* column by 2 df['points'] = df['points'] / 2 #view updated DataFrame df points rebounds assists 0 5.0 7 11 1 6.0 7 8 2 6.0 8 10 3 7.0 13 6 4 6.5 7 6 5 9.0 4 5
Пример 2. Применение функции к определенным столбцам
В следующем коде показано, как применить функцию к определенным столбцам DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df points rebounds assists 0 10 7 11 1 12 7 8 2 12 8 10 3 14 13 6 4 13 7 6 5 18 4 5 #divide values in *points* and *rebounds* column by 2 df[['points', 'rebounds']] = df[['points', 'rebounds']] / 2 #view updated DataFrame df points rebounds assists 0 5.0 3.5 11 1 6.0 3.5 8 2 6.0 4.0 10 3 7.0 6.5 6 4 6.5 3.5 6 5 9.0 2.0 5
Пример 3. Применение функции ко всем столбцам
В следующем коде показано, как применить функцию к каждому столбцу DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df points rebounds assists 0 10 7 11 1 12 7 8 2 12 8 10 3 14 13 6 4 13 7 6 5 18 4 5 #divide values in every column by 2 df = df / 2 #view updated DataFrame df points rebounds assists 0 5.0 3.5 5.5 1 6.0 3.5 4.0 2 6.0 4.0 5.0 3 7.0 6.5 3.0 4 6.5 3.5 3.0 5 9.0 2.0 2.5
10 приемов Python Pandas, которые сделают вашу работу более эффективной
Pandas — это широко используемый пакет Python для структурированных данных. Существует много хороших учебных пособий на данную тематику, но здесь мы бы хотели раскрыть несколько интересных приемов, которые, вероятно, еще пока неизвестны читателю, но могут оказаться крайне полезными.
read_csv
Все знают эту команду. Но если данные, которые вы пытаетесь прочитать, слишком большие, попробуйте добавить команду nrows = 5 , чтобы прочитать сначала небольшую часть данных перед загрузкой всей таблицы. В этом случае вам удастся избежать ситуации выбора неверного разделителя (не всегда в данных есть разделение в виде запятой).
(Или вы можете использовать команду ‘head’ в linux для проверки первых 5 строк в любом текстовом файле: head -c 5 data.txt )
Затем вы можете извлечь список столбцов, используя df.columns.tolist() , а затем добавить команду usecols = [‘c1’, ‘c2’,…], чтобы извлечь только нужные вам столбцы. Кроме того, если вы знаете типы данных определенных столбцов, вы можете добавить dtype = для более быстрой загрузки. Еще одно преимущество этой команды в том, что если у вас есть столбец, который содержит как строки, так и числа, рекомендуется объявить его тип строковым, чтобы не возникало ошибок при попытке объединить таблицы, используя этот столбец в качестве ключа.
select_dtypes
Если предварительная обработка данных должна выполняться в Python, то эта команда сэкономит ваше время. После чтения из таблицы типами данных по умолчанию для каждого столбца могут быть bool, int64, float64, object, category, timedelta64 или datetime64. Вы можете сначала проверить распределение с помощью
df.dtypes.value_counts()
чтобы узнать все возможные типы данных вашего фрейма, затем используйте
df.select_dtypes(include=[‘float64’, ‘int64’])
чтобы выбрать субфрейм только с числовыми характеристиками.
сopy
Это важная команда. Если вы сделаете:
import pandas as pd
df1 = pd.DataFrame(< ‘a’:[0,0,0], ‘b’: [1,1,1]>)
df2 = df1
df2[‘a’] = df2[‘a’] + 1
df1.head()
Вы обнаружите, что df1 изменен. Это потому, что df2 = df1 не делает копию df1 и присваивает ее df2, а устанавливает указатель, указывающий на df1. Таким образом, любые изменения в df2 приведут к изменениям в df1. Чтобы это исправить, вы можете сделать либо:
df2 = df1.copy ()
from copy import deepcopy
df2 = deepcopy(df1)
map
Это классная команда для простого преобразования данных. Сначала вы определяете словарь, в котором «ключами» являются старые значения, а «значениями» являются новые значения.
level_map =
df[‘c_level’] = df[‘c’].map(level_map)
Например: True, False до 1, 0 (для моделирования); определение уровней; определяемые пользователем лексические кодировки.
apply or not apply?
Если нужно создать новый столбец с несколькими другими столбцами в качестве входных данных, функция apply была бы весьма полезна.
def rule(x, y):
if x == ‘high’ and y > 10:
return 1
else:
return 0
df = pd.DataFrame(< 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]>)
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis = 1)
df.head()
В приведенных выше кодах мы определяем функцию с двумя входными переменными и используем функцию apply, чтобы применить ее к столбцам ‘c1’ и ‘c2’.
но проблема «apply» заключается в том, что иногда она занимает очень много времени.
Скажем, если вы хотите рассчитать максимум из двух столбцов «c1» и «c2», конечно, вы можете применить данную команду
df[‘maximum’] = df.apply(lambda x: max(x[‘c1’], x[‘c2’]), axis = 1)
но это будет медленнее, нежели:
df[‘maximum’] = df[[‘c1’,’c2']].max(axis =1)
Вывод: не используйте команду apply, если вы можете выполнить ту же работу используя другие функции (они часто быстрее). Например, если вы хотите округлить столбец ‘c’ до целых чисел, выполните округление (df [‘c’], 0) вместо использования функции apply.
value counts
Это команда для проверки распределения значений. Например, если вы хотите проверить возможные значения и частоту для каждого отдельного значения в столбце «c», вы можете применить
df[‘c’].value_counts()
Есть несколько полезных приемов / функций:
A. normalize = True : если вы хотите проверить частоту вместо подсчетов.
B. dropna = False : если вы хотите включить пропущенные значения в статистику.
C. sort = False : показать статистику, отсортированную по значениям, а не по количеству.
D. df[‘c].value_counts().reset_index().: если вы хотите преобразовать таблицу статистики в датафрейм Pandas и управлять ими.
количество пропущенных значений
При построении моделей может потребоваться исключить строку со слишком большим количеством пропущенных значений / строки со всеми пропущенными значениями. Вы можете использовать .isnull () и .sum () для подсчета количества пропущенных значений в указанных столбцах.
import pandas as pd
import numpy as np
df = pd.DataFrame(< ‘id’: [1,2,3], ‘c1’:[0,0,np.nan], ‘c2’: [np.nan,1,1]>)
df = df[[‘id’, ‘c1’, ‘c2’]]
df[‘num_nulls’] = df[[‘c1’, ‘c2’]].isnull().sum(axis=1)
df.head()
выбрать строки с конкретными идентификаторами
В SQL мы можем сделать это, используя SELECT * FROM… WHERE ID в («A001», «C022»,…), чтобы получить записи с конкретными идентификаторами. Если вы хотите сделать то же самое с pandas, вы можете использовать:
df_filter = df ['ID']. isin (['A001', 'C022', . ])
df [df_filter]
Percentile groups
Допустим, у вас есть столбец с числовыми значениями, и вы хотите классифицировать значения в этом столбце по группам, скажем, топ 5% в группу 1, 5–20% в группу 2, 20–50% в группу 3, нижние 50% в группу 4. Конечно, вы можете сделать это с помощью pandas.cut, но мы бы хотели представить другую функцию:
import numpy as np
cut_points = [np.percentile(df[‘c’], i) for i in [50, 80, 95]]
df[‘group’] = 1
for i in range(3):
df[‘group’] = df[‘group’] + (df[‘c’] < cut_points[i])
# or Которая быстро запускается (не применяется функция apply).to_csv
Опять-таки, это команда, которую используют все. Отметим пару полезных приемов. Первый:print(df[:5].to_csv())Вы можете использовать эту команду, чтобы напечатать первые пять строк того, что будет записано непосредственно в файл.
Еще один прием касается смешанных вместе целых чисел и пропущенных значений. Если столбец содержит как пропущенные значения, так и целые числа, тип данных по-прежнему будет float, а не int. Когда вы экспортируете таблицу, вы можете добавить float_format = '%. 0f', чтобы округлить все числа типа float до целых чисел. Используйте этот прием, если вам нужны только целочисленные выходные данные для всех столбцов – так вы избавитесь от всех назойливых нулей ‘.0’ .
Как использовать Pandas apply() на месте?
Функция apply() в pandas используется для применения пользовательской функции к фрейму или ряду данных. Функцию apply() можно использовать для выполнения преобразований, вычислений и других операций с данными. Функция apply() по умолчанию возвращает новый кадр или серию данных. Мы также можем изменить кадр данных или серию, используя параметр inplace функции apply(). В этой статье мы поймем, как мы можем использовать функцию apply() на месте, с помощью примеров.
Синтаксис функции apply()
df.apply(func, axis=0)Здесь df — это кадр данных, к которому нам нужно применить функцию func. Параметр axis используется для установки применяемой функции в строку (ось=0) или в столбец (ось=1). Func может быть встроенной функцией или пользовательской функцией.
Использование метода apply() без параметра inplace
Когда мы не используем параметр inplace с функцией apply(), она возвращает новый фрейм данных или серию, оставляя исходный фрейм данных неизменным.
Пример
В приведенном ниже примере у нас есть DataFrame со столбцом Name. Мы определяем специальную функцию add_prefix(), которая добавляет префикс 'Mr.' к каждому имени. Используя apply() в столбце «Имя», мы получаем новую серию new_df с измененными именами.
import pandas as pd # Create a DataFrame data = df = pd.DataFrame(data) # Function to add a prefix to names def add_prefix(name): return 'Mr. ' + name # Apply the function to the 'Name' column new_df = df['Name'].apply(add_prefix) # Output the new DataFrame print(new_df)Выход
0 Mr. John 1 Mr. Emily 2 Mr. James 3 Mr. Emma Name: Name, dtype: objectИспользование метода apply() вместо
Передавая параметр inplace методу apply(), мы можем изменить исходный фрейм данных или серию на месте. Нам нужно указать параметр inplace как True.
Пример
В приведенном ниже примере мы сначала создаем DataFrame со столбцами «Имя» и «Возраст». Затем определяется пользовательская функция add_prefix() для добавления префикса «Мистер». каждому имени. Функция apply() применяется к столбцу «Имя» с помощью функции add_prefix(), а параметр inplace=True устанавливается для непосредственного изменения исходного DataFrame. Наконец, измененный DataFrame печатается, отображая имена в столбце 'Имя' с добавленным префиксом.
import pandas as pd # Create a DataFrame data = df = pd.DataFrame(data) # Function to add a prefix to names def add_prefix(name): return 'Mr. ' + name # Apply the function to the 'Name' column in-place df['Name'].apply(add_prefix, inplace=True) # Output the modified DataFrame print(df)Выход
Name Age 0 Mr. John 28 1 Mr. Emily 32 2 Mr. James 25 3 Mr. Emma 29Использование функции Apply с несколькими столбцами
Мы можем реализовать применить функцию() к нескольким столбцам, используя параметр оси. Если мы передаем ось=1, метод Apply применяется по столбцам, а если параметр оси передается как ось=0, метод apply() применяется по строкам.
Пример
В приведенном ниже примере у нас есть DataFrame с тремя столбцами: «Имя», «Возраст» и «Зарплата». Функцияprocess_data() определена для добавления префикса «Г-н». в столбец «Имя» и удвойте значения в столбце «Зарплата». Применяя эту функцию к указанным столбцам с помощью apply() с осью=1, мы модифицируем исходный df DataFrame на месте.
import pandas as pd # Create a DataFrame data = df = pd.DataFrame(data) # Function to add a prefix to names and double the salary def process_data(row): row['Name'] = 'Mr. ' + row['Name'] row['Salary'] *= 2 return row # Apply the function to multiple columns df[['Name', 'Salary']] = df[['Name', 'Salary']].apply(process_data, axis=1) # Output the modified DataFrame print(df)Выход
Name Age Salary 0 Mr. John 28 100000 1 Mr. Emily 32 120000 2 Mr. James 25 90000 3 Mr. Emma 29 110000Когда использовать метод apply() вместо
Метод apply() с параметром inplace, установленным в значение `True`, чаще всего используется, когда мы хотим изменить исходный кадр данных или серию без создания нового объекта. Это поможет сэкономить память и повысить производительность, особенно при работе с большими наборами данных.
Иногда использование метода apply() с параметром inplace, установленным в значение True, изменение исходных данных может быть рискованным, поскольку при неосторожном обращении оно может привести к неожиданным результатам или потере данных. Обычно рекомендуется сделать резервную копию исходных данных перед изменением данных с помощью метода apply().
Заключение
В этой статье мы обсудили, как мы можем использовать метод Pandas apply() на месте и применять пользовательскую функцию, используя ее, к столбцу или ряду фрейма данных. По умолчанию метод apply() возвращает новый кадр данных или серию с примененной функцией. Если мы хотим изменить исходный фрейм данных, нам нужно указать параметр inplace как true.
Как рассчитать сводную статистику?¶
К столбцам с числовыми данными можно применять различные статистические операции. По умолчанию исключаются отсутствующие данные и обрабатываются только строки.
-
Каков средний возраст и стоимость билета пассажиров Титаника?
In [5]: titanic[["Age", "Fare"]].median() Out[5]: Age 28.0000 Fare 14.4542 dtype: float64
Сводная статистика может быть рассчитана для нескольких столбцов одновременно. Помните функцию describe из первого урока ?
In [6]: titanic[["Age", "Fare"]].describe() Out[6]: Age Fare count 714.000000 891.000000 mean 29.699118 32.204208 std 14.526497 49.693429 min 0.420000 0.000000 25% 20.125000 7.910400 50% 28.000000 14.454200 75% 38.000000 31.000000 max 80.000000 512.329200
Вместо предопределенного набора статистических показателей можно задать собственную комбинацию для нескольких столбцов с помощью метода DataFrame.agg() :
In [7]: titanic.agg( . . "Age": ["min", "max", "median", "skew"], . "Fare": ["min", "max", "median", "mean"], . > . ) . Out[7]: Age Fare min 0.420000 0.000000 max 80.000000 512.329200 median 28.000000 14.454200 skew 0.389108 NaN mean NaN 32.204208
В руководстве пользователя
Подробная информация об описательной статистике представлена в разделе руководства пользователя об описательной статистике.
Сводная статистика, сгруппированная по категориям¶
- Каков средний возраст мужчин в сравнении с женщинами среди пассажиров Титаника?
In [8]: titanic[["Sex", "Age"]].groupby("Sex").mean() Out[8]: Age Sex female 27.915709 male 30.726645
Вычисление некоторого показателя (например, mean — средний возраст) для каждой категории в столбце (например, мужчина/женщина в столбце Sex ) — это распространенный подход. Для поддержки этого типа операций используется метод groupby . В целом это соответствует более общему подходу «разделить-применить-объединить»:
- Разделить данные на группы.
- Применить функцию к каждой группе независимо.
- Объединить результаты в структуру данных.
В pandas шаги применения и объединения обычно выполняются вместе.
В предыдущем примере мы сначала явно выбрали 2 столбца. Если этого не сделать, метод mean применяется к каждому столбцу, содержащему числовые данные:
In [9]: titanic.groupby("Sex").mean() Out[9]: PassengerId Survived Pclass Age SibSp Parch Fare Sex female 431.028662 0.742038 2.159236 27.915709 0.694268 0.649682 44.479818 male 454.147314 0.188908 2.389948 30.726645 0.429809 0.235702 25.523893
Нет особого смысла получать среднее значение Pclass . если нас интересует только средний возраст для каждого пола. Выбор столбцов (как обычно, с помощью квадратных скобок [] ) поддерживается и для сгруппированных данных:
In [10]: titanic.groupby("Sex")["Age"].mean() Out[10]: Sex female 27.915709 male 30.726645 Name: Age, dtype: float64
Столбец Pclass содержит числовые данные, но на самом деле представляет 3 категории (или факторы) с метками ‘1’, ‘2’ и ‘3’. соответственно. Подсчитывать статистику по ним особого смысла нет. Поэтому pandas предоставляет тип данных Categorical для обработки таких данных. Более подробная информация представлена в разделе руководства пользователя о категориальных данных.
- Какова средняя стоимость билета для каждой из комбинаций пола и класса обслуживания?
In [11]: titanic.groupby(["Sex", "Pclass"])["Fare"].mean() Out[11]: Sex Pclass female 1 106.125798 2 21.970121 3 16.118810 male 1 67.226127 2 19.741782 3 12.661633 Name: Fare, dtype: float64
В руководстве пользователя
Полное описание подхода «разделить-применить-объединить» приведено в разделе руководства пользователя о групповых операциях.
Подсчет количества записей по категориям¶
- Каково количество пассажиров в каютах каждого класса?
In [12]: titanic["Pclass"].value_counts() Out[12]: 3 491 1 216 2 184 Name: Pclass, dtype: int64
Метод представляет собой сокращение, так как на самом деле это операция группировки в сочетании с подсчетом количества записей в каждой группе:
In [13]: titanic.groupby("Pclass")["Pclass"].count() Out[13]: Pclass 1 216 2 184 3 491 Name: Pclass, dtype: int64
Как size , так и count можно использовать в сочетании с groupby . В то время как size включает значения NaN и просто выдает количество строк (размер таблицы), count исключает пропущенные значения. Используйте аргумент dropna метода value_counts , чтобы включить или исключить значения NaN .
В руководстве пользователя
В руководстве пользователя есть специальный раздел о value_counts , см. страницу о дискретизации.
ЗАПОМНИТЕ
- Сводную статистику можно рассчитать для целых столбцов или строк.
- Сила подхода «разделить-применить-объединить» обеспечивается методом groupby .
- value_counts — это удобное сокращение для подсчета количества записей в каждой категории.
В руководстве пользователя
Полное описание подхода «разделить-применить-объединить» представлено на страницах руководства пользователя о групповых операциях.
Как создать новые столбцы, производные от существующих?
Как изменять структуру таблиц?
© Copyright 2008-2022, the pandas development team. Переведено на русский authoress.
Created using Sphinx 4.3.2.