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

Как посчитать медиану в pandas

  • автор:

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

Вы можете использовать функцию median() , чтобы найти медиану одного или нескольких столбцов в кадре данных pandas:

#find median value in specific column df['column1']. median () #find median value in several columns df[['column1', 'column2']]. median () #find median value in every numeric column df.median () 

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

#create DataFrame df = pd.DataFrame() #view DataFrame df player points assists rebounds 0 A 25 5 11 1 B NA 7 8 2 C 15 7 10 3 D 14 9 6 4 E 19 12 6 5 F 23 9 5 6 G 25 9 9 7 H 29 4 12 

Пример 1: найти медиану одного столбца

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

#find median value of *points* column df['points']. median () 23.0 

Среднее значение в столбце очков равно 23 .

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

Пример 2: найти медиану нескольких столбцов

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

#find median value of *points* and *rebounds* columns df[['points', 'rebounds']]. median () points 23.0 rebounds 8.5 dtype: float64 

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

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

#find median value of all numeric columns df.median () points 23.0 assists 8.0 rebounds 8.5 dtype: float64 

Как найти медианное значение по группе в Pandas

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

df.groupby(['group_variable'])['value_variable']. median().reset_index() 

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

df.groupby(['group1', 'group2'])['value_variable']. median().reset_index() 

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

Пример 1: найти медианное значение по одной группе

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

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df team position points rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 A F 9 6 4 B G 12 6 5 B G 9 5 6 B F 9 9 7 B F 4 12 

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

#calculate median points by team df.groupby(['team'])['points']. median().reset_index() team points 0 A 7.0 1 B 9.0 

Из вывода мы видим:

  • Среднее количество очков, набранных игроками команды А, равно 7 .
  • Среднее количество очков, набранных игроками команды Б, равно 9 .

Обратите внимание, что мы также можем найти медианное значение двух переменных одновременно:

#calculate median points and median rebounds by team df.groupby(['team'])[['points', 'rebounds']]. median () team points rebounds 0 A 7.0 9.0 1 B 9.0 7.5 

Пример 2: найти медианное значение по нескольким группам

В следующем коде показано, как найти медианное значение столбца «очки», сгруппированного по команде и позиции:

#calculate median points by team df.groupby(['team', 'position'])['points']. median().reset_index() team position points 0 A F 8.0 1 A G 6.0 2 B F 6.5 3 B G 10.5 

Из вывода мы видим:

  • Среднее количество очков, набранных игроками на позиции «F» в команде А, равно 8 .
  • Среднее количество очков, набранных игроками в позиции «G» в команде А, равно 6 .
  • Среднее количество очков, набранных игроками на позиции «F» в команде B, составляет 6,5 .
  • Среднее количество очков, набранных игроками на позиции «G» в команде B, составляет 10,5 .

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

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

pandas.DataFrame.median#

Return the median of the values over the requested axis.

Parameters : axis

Axis for the function to be applied on. For Series this parameter is unused and defaults to 0.

For DataFrames, specifying axis=None will apply the aggregation across both axes.

New in version 2.0.0.

skipna bool, default True

Exclude NA/null values when computing the result.

numeric_only bool, default False

Include only float, int, boolean columns. Not implemented for Series.

**kwargs

Additional keyword arguments to be passed to the function.

Returns : Series or scalar

>>> s = pd.Series([1, 2, 3]) >>> s.median() 2.0 

With a DataFrame

>>> df = pd.DataFrame('a': [1, 2], 'b': [2, 3]>, index=['tiger', 'zebra']) >>> df a b tiger 1 2 zebra 2 3 >>> df.median() a 1.5 b 2.5 dtype: float64 
>>> df.median(axis=1) tiger 1.5 zebra 2.5 dtype: float64 

In this case, numeric_only should be set to True to avoid getting an error.

>>> df = pd.DataFrame('a': [1, 2], 'b': ['T', 'Z']>, . index=['tiger', 'zebra']) >>> df.median(numeric_only=True) a 1.5 dtype: float64 

Посчитать медиану списка по уникальным значениям

Нужно посчитать дельту x1, а потом от всех дельт всех медиану для каждой позиции из com — в примере только две. то есть на выходе нужно получить нечто такое:

com x1 delta median 1 5 -1 1 4 -1 -1 1 3 -1 -1 1 2 -1 -1 1 4 2 -1 2 5 1 2 6 1 1 2 8 2 1 2 3 -5 1 

Пробовал через циклы, но опять же занимает очень много времени и выдает ошибку отсюда Ошибка в python pandas, «A value is trying to be set on a copy of a slice from a DataFrame»

Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 28 янв 2019 в 11:03
851 3 3 золотых знака 11 11 серебряных знаков 20 20 бронзовых знаков

2 ответа 2

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

Очень просто. Нужны 2 вещи: rolling , groupby и map . Итак.

Для начала, импортируем пандас и загрузим (распарсим Ваши данные):

import pandas as pd data = '''1 5 1 4 1 3 1 2 1 4 2 5 2 6 2 8 2 3''' data = [list(map(int, filter(lambda el: len(el) > 0, l.split(' ')))) for l in x.split('\n')] 

Вот что получается:

[[1, 5], [1, 4], [1, 3], [1, 2], [1, 4], [2, 5], [2, 6], [2, 8], [2, 3]] 
df = pd.DataFrame(data, columns=['com', 'x1']) df 

DataFrame example

Используем rolling , чтобы посчитать дельту:

df['delta'] = df['x1'].rolling(window=2).apply(lambda x: x[1] - x[0], raw=True) 

delta

В заключение, с помощью map заполним все значениия в колонке median :

df['median'] = df['com'] df['median'] = df['median'].map(df.groupby('com')['delta'].median().to_dict()) df 

Result

Отслеживать
ответ дан 28 янв 2019 в 12:54
hedgehogues hedgehogues
9,511 9 9 золотых знаков 50 50 серебряных знаков 105 105 бронзовых знаков

кстати, загружать данные из вопросов на SO можно проще: сначала набираем в iPython/Jupyter: df = pd.read_clipboard() , потом кладем в буфер обмена данные с именами столбцов из вопроса и нажимаем Enter 😉

28 янв 2019 в 15:51

In [24]: grp = df.groupby('com') In [25]: df['delta'] = grp['x1'].diff() In [26]: df['median'] = grp['delta'].transform('median') 
In [27]: df Out[27]: com x1 delta median 0 1 5 NaN -1.0 1 1 4 -1.0 -1.0 2 1 3 -1.0 -1.0 3 1 2 -1.0 -1.0 4 1 4 2.0 -1.0 5 2 5 NaN 1.0 6 2 6 1.0 1.0 7 2 8 2.0 1.0 8 2 3 -5.0 1.0 

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

In [33]: df['median'] = df.groupby('com')['x1'].transform(lambda c: c.diff().median()) In [34]: df Out[34]: com x1 median 0 1 5 -1 1 1 4 -1 2 1 3 -1 3 1 2 -1 4 1 4 -1 5 2 5 1 6 2 6 1 7 2 8 1 8 2 3 1 

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

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