Группировка данных по определенному столбцу, коэффициент усреднения другого столбца? - PullRequest
0 голосов
/ 01 июля 2018

У меня есть фрейм данных со столбцами: Year и Min Delay. Пример строки следующим образом:

2014    0
2014    2
2014    0
2014    4
2015    4
2015    4
2015    2
2015    2

Я хочу сгруппировать этот фрейм данных по годам и найти коэффициент задержки в год (т. Е. Число ненулевых записей в этом году, деленное на общее количество записей в этом году). Поэтому, если мы рассмотрим кадр данных выше, я пытаюсь получить следующее:

2014  0.5
2015  1

(в 2014 году было 2 задержки, всего 4, 4 задержки в 2015 году всего 4. Задержка определяется как Min Delay> 0)

Вот что я попробовал:

def find_ratio(df):
    ratio = 1 - (len(df[df == 0]) / len(df))
    return ratio


print(df.groupby(["Year"])["Min Delay"].transform(find_ratio).unique())

который печатает: [0.5 1]

Как получить массив данных вместо массива?

1 Ответ

0 голосов
/ 01 июля 2018

Сначала я думаю, unique не очень хорошая идея, используйте здесь. Потому что, если нужно присвоить вывод функции годам, это невозможно.

Также transform хорошая идея, если нужен новый столбец для DataFrame, а не агрегированный DataFrame.


Я думаю, нужно GroupBy.apply, также следует упростить функцию с помощью логической маски:

def find_ratio(df):
    ratio = (df != 0).mean()
    return ratio

print(df.groupby(["Year"])["Min Delay"].apply(find_ratio).reset_index(name='ratio'))

   Year  ratio
0  2014    0.5
1  2015    1.0

Решение с лямбда-функцией:

print (df.groupby(["Year"])["Min Delay"]
         .apply(lambda x: (x != 0).mean())
         .reset_index(name='ratio'))

   Year  ratio
0  2014    0.5
1  2015    1.0

Решение с GroupBy.transform вернуть новый столбец:

df['ratio'] = df.groupby(["Year"])["Min Delay"].transform(find_ratio)
print (df)
   Year  Min Delay  ratio
0  2014          0    0.5
1  2014          2    0.5
2  2014          0    0.5
3  2014          4    0.5
4  2015          4    0.0
5  2015          4    0.0
6  2015          2    0.0
7  2015          2    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...