如果值在分组中,使用Pandas groupby求和

3

数据样本,实际数据包含多年。类型为 “Lien” 或 “Lien Endorsement” 的项每年只能出现一次。其他类型可以在同一年内重复。

tax_allyears =

tax_year    type                amount  
2013        Lien Interest       4
2014        Lien Interest       10
2014        Lien                100
2014        Lien Interest       15
2013        Lien Endorsement    200

这行代码几乎可用,它按年份汇总“抵押利息”值。

by_year_interest = tax_allyears_1[tax_allyears_1['type'] == 'Lien Interest'].groupby(by=['tax_year'])['amount'].sum()

我想要区分具备“留置权”与“留置权利息”的年份。
by_year_Lien_interest = 某个函数
tax_year    amount
2014        25

按年度计算的抵押保险批准利息 = 某个函数

tax_year    amount
2013        4
2个回答

1
你可以先创建两个不同的唯一年份列表,一个包含 Lien,另一个包含 Lien Endorsement。然后在过滤 tax_allyears 数据框时,使用这些唯一列表作为条件,使用 Series.isin。示例 -
lienyears = tax_allyears.loc[tax_allyears['type'] == 'Lien','tax_year'].unique().tolist()
lienendorsementyears = tax_allyears.loc[tax_allyears['type'] == 'Lien Endorsement','tax_year'].unique().tolist()

by_year_lien_interest = tax_allyears[(tax_allyears['type'] == 'Lien Interest') & tax_allyears['tax_year'].isin(lienyears)].groupby('tax_year')['amount'].sum()
by_year_lien_endorsement_interest = tax_allyears[(tax_allyears['type'] == 'Lien Interest') & tax_allyears['tax_year'].isin(lienendorsementyears)].groupby('tax_year')['amount'].sum()

演示 -

In [7]: tax_allyears
Out[7]:
   tax_year              type  amount
0      2013     Lien Interest       4
1      2014     Lien Interest      10
2      2014              Lien     100
3      2014     Lien Interest      15
4      2013  Lien Endorsement     200

In [9]: lienyears = tax_allyears.loc[tax_allyears['type'] == 'Lien','tax_year'].unique().tolist()

In [10]: lienendorsementyears = tax_allyears.loc[tax_allyears['type'] == 'Lien Endorsement','tax_year'].unique().tolist()

In [13]: by_year_lien_interest = tax_allyears[(tax_allyears['type'] == 'Lien Interest') & tax_allyears['tax_year'].isin(lienyears)].groupby('tax_year')['amount'].sum()

In [15]: by_year_lien_endorsement_interest = tax_allyears[(tax_allyears['type'] == 'Lien Interest') & tax_allyears['tax_year'].isin(lienendorsementyears)].groupby('tax_year')['amount'].sum()

In [16]: by_year_lien_interest
Out[16]:
tax_year
2014    25
Name: amount, dtype: int64

In [17]: by_year_lien_endorsement_interest
Out[17]:
tax_year
2013    4
Name: amount, dtype: int64

我过于简化了问题,实际上还需要在初始列表中包括一个Parcel_Id列。话虽如此,我现在认为我可以解决它了。我会花点时间来处理它,并更新问题,如果您愿意,也可以更新答案。谢谢! - Vincent

0
如果tax_yeartypeamountDataFrame中的columns名称,那么您可以这样做:
# Create a groupby object
name = df.groupby(['tax_year', 'type'])

# Apply the sum function to the groupby object
df = name.sum()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接