Как использовать groupby max в собственной функции groupby? - PullRequest
2 голосов
/ 17 июня 2020

У меня есть следующий df

d = {'CAT':['C1','C2','C1','C2'],'A': [10, 20,30,40], 'B': [3, 4,10,3]}
df1 = pd.DataFrame(data=d)

Я пытаюсь включить новый столбец, полученный путем деления «A» на самый высокий «B», это категория («CAT»). То есть я хочу разделить 10 на 10, 20 на 4, 10 на 10 и 40 на 4, чтобы получить следующий df

d = {'CAT':['C1','C2','C1','C2'],'A': [10, 20,30,40], 'B': [3, 4,10,3], 'C':[1,5,3,10]}

Есть предложения?



Я считаю, что легко обойтись без условия / groupby на CAT

d = {'A': [10, 20,30,40], 'B': [3, 4,10,3]}
df1 = pd.DataFrame(data=d)
df1 = df1.apply(lambda x:x.A/max(df1['B']),axis=1)

, но с 'CAT' у меня проблемы.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы можете сделать это одной строкой; Я только разбил его на отдельные строки для большей наглядности. преобразование разрешает репликацию группы по всему кадру данных; с этим мы можем получить результаты для столбца C:

grouping = df1.groupby("CAT").B.transform("max")
df1['C'] = df1.A.div(grouping)
df1



    CAT A   B   C
0   C1  10  3   1.0
1   C2  20  4   5.0
2   C1  30  10  3.0
3   C2  40  3   10.0
0 голосов
/ 17 июня 2020

вы почти полностью освоили применение apply. В зависимости от того, насколько велик ваш фактический набор данных, использование apply может работать как неэффективное, но игнорируя это, вы можете решить свою проблему с помощью функции 'max' в фильтре фрейма данных, а не самого df.

Или, просто чтобы добраться до кода:

df1['calculation'] = df1.apply(lambda row: row['A'] / max(df1[df1['CAT'] == row['CAT']]['B']), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...