Pandas групповое использование агрегатов на основе двух столбцов - PullRequest
0 голосов
/ 23 апреля 2020

Представьте, что у меня есть следующий фрейм данных:

np.random.seed(42)
t = pd.DataFrame({'year': 4*['2018']+3*['2019']+4*['2016'], 
                  'pop': np.random.randint(10, 100, size=(11)),
                 'production': np.random.randint(2000, 40000, size=(11))})

print(t)
year  pop  production
 2018   61        3685
 2018   24        2769
 2018   81        4433
 2018   70        7311
 2019   30       39819
 2019   92       19568
 2019   96       21769
 2016   84       30693
 2016   84        8396
 2016   97       29480
 2016   33       27658

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

tmp = t.groupby('year').sum()

tmp['production']/tmp['pop']

year
2016    322.909396
2018     77.110169
2019    372.275229

Я думал, можно ли это сделать, используя групповой год, а затем использовать agg, основанный на двух столбцах, что-то вроде:

#doesn't work
t.groupby('year').agg(prod_per_pop = (['pop', 'production'], 
                         lambda x: x['production'].sum()/x['pop'].sum()))

Мой вопрос в принципе, возможно ли использовать какой-либо pandas Групповой метод для достижения этого простым способом, вместо того, чтобы создавать другой фрейм данных и затем делить его.

1 Ответ

2 голосов
/ 23 апреля 2020

Вы можете использовать лямбда-функции с axis=1, чтобы решить это в одной строке.

t.groupby('year')['pop','production'].agg('sum').apply(lambda x: x['production']/x['pop'], axis=1)
...