Сумма внутри групповых питонов панд - PullRequest
0 голосов
/ 01 июля 2019

Я создал серию следующим образом:

pop_by_state = population.groupby(states)

Где население и штаты были сериями одинакового размера, но было три (разные) популяции для каждого (повторного) состояния.Когда я печатаю pop_by_state, я получаю таблицу, в которой каждая из трех популяций во втором столбце связана с каждым состоянием в первом (состояние от одной ячейки до трех популяций ячеек).

Теперь я хотел быСуммируйте эти три значения для каждого штата и получите ряд с общей численностью населения для каждого штата.

Как мне действовать?

1 Ответ

1 голос
/ 01 июля 2019

Я случайно сгенерировал 1000-рядный DataFrame со случайными парами состояния и популяции: примерно так:

import random
import pandas as pd

states = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS',
 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR',
 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']
df = pd.DataFrame(columns=['states','pop'])

for i in range(1000):
    curr_state = states[random.randint(0, len(states)-1)]
    rand_pop = random.randint(0, 100)
    df[loc] = [curr_state, rand_pop]

После этого, проведя некоторые эксперименты, я обнаружил, что эта абсолютно чудовищная цепочка группировок и агрегатов поможет вамчто вы хотите:

df.groupby('states').apply(pd.DataFrame.nlargest, 3, columns='pop').groupby('states').sum().reset_index()

Давайте разберемся с этим.По сути, требуется две агрегации, следовательно, два вызова pd.DataFrame.groupby:

  1. Нам нужно получить три верхние строки в каждой группе состояний.
  2. Нам нужно получитьсумма этих трех верхних строк определяется состоянием.

df.groupby('states').apply(pd.DataFrame.nlargest, 3, columns='pop') получает три верхние строки каждой группы состояний.Мы используем .apply() вместо .nlargest() напрямую, потому что первый работает для групповых объектов, а второй - нет.Обратите внимание, как параметр columns передается в качестве ключевого аргумента в вызове .apply(), так что .nlargest() получает два обязательных аргумента.

Теперь, когда у нас есть три самые большие строки, соответствующие каждому состоянию,суммируем и суммируем: .groupby('states').sum().Вуаля!

И .reset_index() реорганизует DataFrame, как всегда.

Надеюсь, эта версия больше соответствует вашим потребностям!

...