使用多列分组方式后过滤结果

时间:2018-12-11 11:05:38

标签: python pandas dataframe group-by

我有一个看起来像这样的数据框:

Type     Months     Year    Marks
 a        1          2018     64
 a        1          2017     69
 a        1          2016     69
 b        1          2018     78
 b        1          2017     71
 b        1          2016     91
 c        1          2018     58
 c        1          2017     65
 c        1          2016     83

 a        2          2018     58
 a        2          2017     65
 a        2          2016     83
 a        3          2018     58
 a        3          2017     65
 a        3          2016     83

我想按“类型”,“月”,“年”分组并总结分数。

sumOfTypes = data.groupby(['Type','Months','Year'])['Marks'].sum()

结果如下:

(a, 1, 2018)                  60
(a, 1, 2017)                  54
 .
 .
(c, 1, 2016)                  86           
(c, 2, 2018)                  89

但是,我希望仅将类型'a'和'b'的数据过滤到。

另外,我想检验(c,2018年2月2日)在不同的数据框列中,以便结果如下所示:

df_grouped:

   Type     Months     Year    Marks    
    c         2        2018     89

我当前的代码:

sumOfTypes = data.groupby(['Type','Months','Year'])['Marks'].sum()
df_grouped = pd.DataFrame(sumOfTypes)

1 个答案:

答案 0 :(得分:1)

添加as_index=Falsereset_index以返回DataFrame,然后用boolean indexingisin进行过滤:

sumOfTypes = data.groupby(['Type','Months','Year'], as_index=False)['Marks'].sum()
#alternative
#sumOfTypes = data.groupby(['Type','Months','Year'])['Marks'].sum().reset_index()

df = sumOfTypes[sumOfTypes['Type'].isin(['a','b'])]

或通过boolean indexingMultiIndex Series进行过滤,以选择级别使用get_level_values

sumOfTypes = data.groupby(['Type','Months','Year'])['Marks'].sum()

s = sumOfTypes[sumOfTypes.index.get_level_values('Type').isin(['a','b'])]