首页 > 解决方案 > 如何有效地过滤通过双列 groupby 操作获得的数据帧以仅包含第二个索引的最大值和最小值?

问题描述

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

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

这是前 11 行的输出df

                      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 行。我知道我可以通过循环来做到这一点,但我正在努力更好地理解 pandas 的操作,并且想知道如何更有效地做到这一点。

可以使用以下方法将上述示例数据从 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

标签: pythonpandaspandas-groupby

解决方案


你可以单独做,然后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()

推荐阅读