如果计数等于条件,则熊猫groupby总和

时间:2019-06-29 14:19:31

标签: python pandas

我正在从FRED下载数据。我正在汇总以获取年度数字,但不要不完整的年份。因此,如果计算obs的数量为12,则我需要一个求和条件,因为该系列是每月一次。

import pandas_datareader.data as web

mnemonic = 'RSFSXMV'

df = web.DataReader(mnemonic, 'fred', 2000, 2020)
df['year'] = df.index.year
new_df = df.groupby(["year"])[mnemonic].sum().reset_index()
print(new_df)

我不希望2019年出现。

2 个答案:

答案 0 :(得分:1)

在您的情况下,我们将transformnunique结合使用以确保每年应该有12个唯一的月份,如果没有,我们在进行groupby sum之前将其删除>

df['Month']=df.index.month
m=df.groupby('year').Month.transform('nunique')==12
new_df = df.loc[m].groupby(["year"])[mnemonic].sum().reset_index()

isin

df['Month']=df.index.month
m=df.groupby('year').Month.nunique()
new_df = df.loc[df.year.isin(m.index[m==12)].groupby(["year"])[mnemonic].sum().reset_index()

答案 1 :(得分:1)

您可以在count时使用集合函数groupby

df['year'] = df.index.year
df = df.groupby('year').agg({'RSFSXMV': 'sum', 'year': 'count'})

这将为您提供:

        RSFSXMV  year
year
2000    2487790   12
2001    2563218   12
2002    2641870   12
2003    2770397   12
2004    2969282   12
2005    3196141   12
2006    3397323   12
2007    3531906   12
2008    3601512   12
2009    3393753   12
2010    3541327   12
2011    3784014   12
2012    3934506   12
2013    4043037   12
2014    4191342   12
2015    4252113   12
2016    4357528   12
2017    4561833   12
2018    4810502   12
2019    2042147   5

然后只需删除年份少于12的行