Как найти среднее число в pandas
Перейти к содержимому

Как найти среднее число в pandas

  • автор:

Как рассчитать условное среднее значение в Pandas (с примерами)

Вы можете использовать следующий синтаксис для вычисления условного среднего значения в pandas:

df.loc[df['team'] == 'A', 'points'].mean() 

Это вычисляет среднее значение столбца «точки» для каждой строки в DataFrame, где столбец «команда» равен «А».

В следующих примерах показано, как использовать этот синтаксис на практике со следующими пандами DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame print(df) team points assists 0 A 99 33 1 A 90 28 2 A 93 31 3 B 86 39 4 B 88 34 5 B 82 30 

Пример 1: Расчет условного среднего для категориальной переменной

В следующем коде показано, как вычислить среднее значение столбца «точки» только для строк в DataFrame, где столбец «команда» имеет значение «А».

#calculate mean of 'points' column for rows where team equals 'A' df.loc[df['team'] == 'A', 'points'].mean() 94.0 

Среднее значение в столбце «Очки» для строк, где «команда» равно «А», равно 94 .

Мы можем вручную проверить это, рассчитав среднее значение очков только для строк, где «команда» равна «А»:

  • Среднее количество баллов: (99 + 90 + 93) / 3 = 94

Пример 2. Вычисление условного среднего для числовой переменной

В следующем коде показано, как вычислить среднее значение столбца «помощь» только для строк в DataFrame, где столбец «точки» имеет значение больше или равное 90.

#calculate mean of 'assists' column for rows where 'points' >= 90 df.loc[df['points'] >= 90 , 'assists'].mean() 30.666666666666668 

Среднее значение в столбце «ассисты» для строк, где «очки» больше или равны 90, составляет 30,66667 .

Мы можем вручную проверить это, рассчитав среднее значение очков только для строк, где «команда» равна «А»:

  • Среднее количество передач: (33 + 28 + 31) / 3 = 30,66667.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные задачи в pandas:

Как рассчитать среднее значение столбцов в Pandas

Часто вам может быть интересно вычислить среднее значение одного или нескольких столбцов в кадре данных pandas. К счастью, вы можете легко сделать это в pandas, используя функцию mean() .

В этом руководстве показано несколько примеров использования этой функции.

Пример 1. Найдите среднее значение одного столбца

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd import numpy as np #create DataFrame df = pd.DataFrame() #view DataFrame df player points assists rebounds 0 A 25 5 NaN 1 B 20 7 8.0 2 C 14 7 10.0 3 D 16 8 6.0 4 E 27 5 6.0 5 F 20 7 9.0 6 G 12 6 6.0 7 H 15 9 10.0 8 I 14 9 10.0 9 J 19 5 7.0 

Мы можем найти среднее значение столбца под названием «точки», используя следующий синтаксис:

df['points'].mean() 18.2 

Функция mean() также будет исключать NA по умолчанию. Например, если мы найдем среднее значение столбца «отскоки», первое значение «NaN» будет просто исключено из расчета:

df['rebounds'].mean() 8.0 

Если вы попытаетесь найти среднее значение столбца, который не является числовым, вы получите сообщение об ошибке:

df['player'].mean() TypeError: Could not convert ABCDEFGHIJ to numeric 

Пример 2. Найдите среднее значение нескольких столбцов

Мы можем найти среднее значение нескольких столбцов, используя следующий синтаксис:

#find mean of points and rebounds columns df[['rebounds', 'points']].mean() rebounds 8.0 points 18.2 dtype: float64 

Пример 3. Найдите среднее значение всех столбцов

Мы можем также найти среднее значение всех числовых столбцов, используя следующий синтаксис:

#find mean of all numeric columns in DataFrame df.mean () points 18.2 assists 6.8 rebounds 8.0 dtype: float64 

Обратите внимание, что функция mean() просто пропустит столбцы, которые не являются числовыми.

Как рассчитать сводную статистику?¶

К столбцам с числовыми данными можно применять различные статистические операции. По умолчанию исключаются отсутствующие данные и обрабатываются только строки.

    Каков средний возраст и стоимость билета пассажиров Титаника?

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.

Как найти среднее по числовому диапазону столбца в датафрейме python

Есть следующий датафрейм, где в колонке Q29 — задан числовой диапазон, например, 10,000 — 15,000 .
Нужно добавить колонку со средним значением от этих цифр. Предполагаю, что надо разбить сплитом а дальше что, не получается корректно сделать. Помогите!

 Q23 Q29 4 Data Scientist 25,000-29,999 17 Data Scientist 200,000-249,999 18 Data Scientist 150,000-199,999 30 Data Scientist 50,000-59,999 33 Machine Learnin 125,000-149,999 . . . 23932 Data Scientist 1,000-1,999 23935 Data Scientist 30,000-39,999 23964 Data Scientist 1,000-1,999 23983 Machine Learnin 25,000-29,999 23990 Data Scientist 2,000-2,999 

попробовала получить уникальные значения, получила массив:

array(['25,000-29,999', '200,000-249,999', '150,000-199,999', '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999', '30,000-39,999', nan, '$0-999', '4,000-4,999', '3,000-3,999', '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999', '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999', '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999', '300,000-499,999', '250,000-299,999', '$500,000-999,999'], dtype=object) 

перевести в флоат так же не получается. Подскажите, логику действий, пожалуйста.
Отслеживать
75.2k 120 120 золотых знаков 38 38 серебряных знаков 57 57 бронзовых знаков
задан 26 июл 2023 в 19:25

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вам для начала нужно подготовить данные в датафрейме — там много мусора и есть значения, которые могут быть заведомо неверно интерпретированы при расчетах. Поэтому, сначала убираем nan , затем чистим, конвертируем и вычисляем. В общем случае можно сделать как-то так:

import pandas as pd import numpy as np a = ['25,000-29,999', '200,000-249,999', '150,000-199,999', '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999', '30,000-39,999', np.nan, '$0-999', '4,000-4,999', '3,000-3,999', '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999', '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999', '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999', '300,000-499,999', '250,000-299,999', '$500,000-999,999'] df = pd.DataFrame(a, columns=["Q29"]) df = df.dropna() df["mean"] = df["Q29"].str.replace(r"[^0-9-]",'', regex=True).str.split("-").apply(lambda s: sum([float(x) for x in s])/len(s) if len(s)>1 else np.nan) print(df) 
 Q29 mean 0 25,000-29,999 27499.5 1 200,000-249,999 224999.5 2 150,000-199,999 174999.5 3 50,000-59,999 54999.5 4 125,000-149,999 137499.5 5 5,000-7,499 6249.5 6 10,000-14,999 12499.5 7 30,000-39,999 34999.5 9 $0-999 499.5 10 4,000-4,999 4499.5 11 3,000-3,999 3499.5 12 80,000-89,999 84999.5 13 7,500-9,999 8749.5 14 100,000-124,999 112499.5 15 1,000-1,999 1499.5 16 15,000-19,999 17499.5 17 90,000-99,999 94999.5 18 40,000-49,999 44999.5 19 60,000-69,999 64999.5 20 >$1,000,000 NaN 21 70,000-79,999 74999.5 22 2,000-2,999 2499.5 23 20,000-24,999 22499.5 24 300,000-499,999 399999.5 25 250,000-299,999 274999.5 26 $500,000-999,999 749999.5 

при этом всё равно остается неясность, как интерпретировать запятую. я вот решил, что она — разделитель разрядов, а не целой и дробной части.

Отслеживать
ответ дан 26 июл 2023 в 20:10
26k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
sum([float(x) for x in s]) -> sum(map(float, s)) , так и проще и понятнее
27 июл 2023 в 5:35
@CrazyElf я оставил генератор, потому что у был вариант с проверкой условия внутри него.
27 июл 2023 в 7:04

Если проверка будет, то да. Но в любом случае квадратные скобки там лишние — это лишнее преобразование генератора в список, для передачи в sum оно не нужно.

27 июл 2023 в 7:30

Берем колонку ‘Q29’, удаляем в ней НаНы (не удаляя строк во фрейме), удаляем из строк нечисловые символы, затем разбиваем по дефису на 2 колонки, их преобразуем во float, далее находим среднее через метод mean() . Результат пишем в столбец «Среднее», который совмещается с фреймом по индексам. Таким образом, во фрейме остаются все строки, а там, где были НаНы в исходном столбце, остаются НаНы.

df = pd.DataFrame(['25,000-29,999', '200,000-249,999', '150,000-199,999', '50,000-59,999', '125,000-149,999', '5,000-7,499', '10,000-14,999', '30,000-39,999', None, '$0-999', '4,000-4,999', '3,000-3,999', '80,000-89,999', '7,500-9,999', '100,000-124,999', '1,000-1,999', '15,000-19,999', '90,000-99,999', '40,000-49,999', '60,000-69,999', '>$1,000,000', '70,000-79,999', '2,000-2,999', '20,000-24,999', '300,000-499,999', '250,000-299,999', '$500,000-999,999'], columns=['Q29']) df['Среднее'] = df.Q29.dropna().str.replace('[^\d-]', '', regex=True).str.split('-', expand=True).astype(float).mean(axis=1) print(df) 
 Q29 Среднее 0 25,000-29,999 27499.5 1 200,000-249,999 224999.5 2 150,000-199,999 174999.5 3 50,000-59,999 54999.5 4 125,000-149,999 137499.5 5 5,000-7,499 6249.5 6 10,000-14,999 12499.5 7 30,000-39,999 34999.5 8 None NaN 9 $0-999 499.5 10 4,000-4,999 4499.5 11 3,000-3,999 3499.5 12 80,000-89,999 84999.5 13 7,500-9,999 8749.5 14 100,000-124,999 112499.5 15 1,000-1,999 1499.5 16 15,000-19,999 17499.5 17 90,000-99,999 94999.5 18 40,000-49,999 44999.5 19 60,000-69,999 64999.5 20 >$1,000,000 1000000.0 21 70,000-79,999 74999.5 22 2,000-2,999 2499.5 23 20,000-24,999 22499.5 24 300,000-499,999 399999.5 25 250,000-299,999 274999.5 26 $500,000-999,999 749999.5 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *