如何有效地过滤由两列groupby操作获得的数据帧,使其仅包括第二个索引的最大值和最小值?

时间:2019-04-19 22:23:14

标签: python pandas pandas-groupby

我有一个数据帧df,该数据帧是通过执行两列groupby操作获得的:

df = data.groupby(['letters', 'syllables']).size()

以下是df的前11行的输出:

                      0
letters syllables      
1       1            25
        3             1
2       1           188
        2            44
        3             1
        4             1
3       1          1304
        2           189
        3            89
        4             2
        5             3

我想过滤df,以便对于letters中的每个索引,仅显示syllables的最大和最小索引,并提供以下输出:

                      0
letters syllables      
1       1            25
        3             1
2       1           188
        4             1
3       1          1304
        5             3

更好的办法是创建一个像这样的数据框:

                               0
letters statistic syllables     
1       min       1           25
        max       3            1
2       min       1          188
        max       4            1
3       min       1         1304
        max       5            3

整个数据帧有120行。我知道我可以循环执行此操作,但是我试图更好地了解熊猫的操作,并想知道如何更有效地执行此操作。

可以使用以下命令将以上示例数据从csv文件导入多级索引数据框中:

df = pd.read_csv('data.csv', index_col=[0,1])

编辑:这是Erfan建议的代码输出:

df = data.groupby(['letters', 'syllables']).agg({'letters' : 'size', 'syllables' : ['min', 'max']})

输出:

                  letters syllables    
                     size       min max
letters syllables                      
1       1              25         1   1
        3               1         3   3
2       1             188         1   1
        2              44         2   2
        3               1         3   3
        4               1         4   4
3       1            1304         1   1
        2             189         2   2
        3              89         3   3
        4               2         4   4
        5               3         5   5

1 个答案:

答案 0 :(得分:1)

您可以单独进行操作,然后concat将其退回

s=data.groupby(['letters', 'syllables']).size().sort_values(0)
yourdf=pd.concat([s.groupby(level=0).head(1),s.groupby(level=0).tail(1)],keys=['min','max']).swaplevel(i=0,j=1).sort_index()