索引系列上的nlargest()不会返回每个索引的结果

时间:2019-12-31 04:51:21

标签: pandas

我有一个选举候选人,捐赠者的职业和捐赠(收到)金额的数据框。 而且,我试图找出每位候选人获得的前7大金额。

candidate name = cand_nm
donors' occupation = contbr_occupation
received amount = contb_receipt_amt

因此,我首先根据候选人的姓名和捐赠者的职业对数据框进行分组,然后使用.sum()将捐赠金额相加

grouped = df.groupby(['cand_nm','contbr_occupation'])['contb_receipt_amt'].sum()

然后,我按如下方式使用nlargest(),但它从整个系列而不是每个组中返回前7个金额。如何计算每个组的前7名捐款金额?

grouped.nlargest(7)

另一个问题是“分组”变量似乎是一个索引序列。但是,当我使用grouped.index打印其索引时,它不会返回“ cand_nm”或“ contbr_occupation”。我以为这是一个索引系列是错误的吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以将SeriesGroupBy.nlargestgroup_keys=False一起使用,以避免重复MultiIndex的级别:

s1 = grouped.groupby(level=0, group_keys=False).nlargest(7)

或将Series.sort_valuesGroupBy.head一起使用:

s1 = grouped.sort_values(ascending=False).groupby(level=0).head(7)

示例

df = pd.DataFrame({
        'contbr_occupation':list('abcdef'),
        'cand_nm':list('aaabbb'),
        'contb_receipt_amt':[7,8,9,4,2,3]
})

grouped = df.groupby(['cand_nm','contbr_occupation'])['contb_receipt_amt'].sum()

s1 = grouped.sort_values(ascending=False).groupby(level=0).head(2)
print (s1)
cand_nm  contbr_occupation
a        c                    9
         b                    8
b        d                    4
         f                    3
Name: contb_receipt_amt, dtype: int64

s1 = grouped.groupby(level=0, group_keys=False).nlargest(2)
print (s1)
cand_nm  contbr_occupation
a        c                    9
         b                    8
b        d                    4
         f                    3
Name: contb_receipt_amt, dtype: int64

最后DataFrame添加Series.reset_index

df1 = s1.reset_index()
print (df1)
  cand_nm contbr_occupation  contb_receipt_amt
0       a                 c                  9
1       a                 b                  8
2       b                 d                  4
3       b                 f                  3