groupby python pandas内部的总和

时间:2019-06-30 21:28:02

标签: python pandas sum pandas-groupby

我创建了如下系列:

pop_by_state = population.groupby(states)

人口和州是相同大小的系列,但是每个(重复)州有三个(不同)人口。当我打印pop_by_state时,我得到一个表,其中第二列中的三个人口中的每个人口与第一状态中的每个州相关联(一个“单元”状态为三个“单元”人口)。

现在,我想对每个州的这三个值求和,并得到每个州的总人口数。

我该如何进行?

1 个答案:

答案 0 :(得分:1)

我随机生成了一个具有随机状态和总体对的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(),因为前者适用于groupby对象,而后者不适用于groupby对象。请注意,如何在调用columns内将参数.apply()作为关键字参数传递,以便.nlargest()接收其两个必需参数。

现在,我们拥有与每个状态相对应的三个最大行,我们进行汇总和求和:.groupby('states').sum()。瞧!

.reset_index()和往常一样重新对齐DataFrame。

希望此版本更适合您的需求!