python - 在 MultiIndex 级别和 groupby 上迭代 Pandas 以获取总计

标签 python pandas

我有一个 pandas 数据框,就像前四列形成多重索引:

import pandas as pd
data = [[1, 'A', 1, 0, 10],
        [1, 'A', 0, 1, 10],
        [1, 'A', 1, 1, 10],
        [1, 'A', 0, 0, 10],
        [1, 'B', 1, 0, 10],
        [1, 'B', 0, 1, 10],
        [1, 'B', 1, 1, 10],
        [1, 'B', 0, 0, 10]]
cols = ['user_id','type','flag1','flag2','cnt']
df = pd.DataFrame(data,columns = cols)
df = df.set_index(['user_id','type','flag1','flag2'])
print df

user_id    type    flag1    flag2    cnt
________________________________________
1          A       1        0        10
1          A       0        1        10
1          A       1        1        10
1          A       0        0        10
1          B       1        0        10
1          B       0        1        10
1          B       1        1        10
1          B       0        0        10

我想迭代索引值以获得每个唯一索引值的分组总数,如下所示:

user_id    type    flag1    flag2    cnt
________________________________________
1          ALL     ALL      ALL      80
1          ALL     ALL      0        40
1          ALL     ALL      1        40
1          ALL     1        ALL      40
1          ALL     0        ALL      40
1          A       ALL      ALL      40
1          B       ALL      ALL      40
1          A       ALL      0        20
1          A       ALL      1        20
1          B       ALL      0        20
1          B       ALL      1        20
1          A       1        ALL      20
1          A       0        ALL      20
1          B       1        ALL      20
1          B       0        ALL      20
1          A       1        0        10
1          A       0        1        10
1          A       1        1        10
1          A       0        0        10
1          B       1        0        10
1          B       0        1        10
1          B       1        1        10
1          B       0        0        10

我可以使用查询和 groupby 轻松生成每个组,但理想情况下我希望能够迭代任意数量的索引列以获得 cnt 列的总和。

最佳答案

与之前的答案类似,这里有一个使用 itertoolsgroupby 的稍微简化的方法:

from itertools import chain, combinations
indices = ['user_id','type','flag1','flag2']
powerset = list(chain.from_iterable(combinations(indices, r) for r in range(1,len(indices)+1)))

master = (pd.concat([df.reset_index().groupby(p, as_index=False).sum() 
                     for p in powerset if p[0] == "user_id"])[cols]
            .replace([None,4,2], "ALL")
            .sort_values("cnt", ascending=False))

输出:

user_id type flag1 flag2  cnt
0        1  ALL   ALL   ALL   80
0        1    A   ALL   ALL   40
1        1    B   ALL   ALL   40
0        1  ALL     0   ALL   40
1        1  ALL     1   ALL   40
0        1  ALL   ALL     0   40
1        1  ALL   ALL     1   40
3        1  ALL     1     1   20
2        1  ALL     1     0   20
1        1  ALL     0     1   20
0        1  ALL     0     0   20
3        1    B     1     1   20
2        1    B     1     0   20
1        1    A     1     1   20
0        1    A     1     0   20
3        1    B     1     1   20
2        1    B     0     1   20
1        1    A     1     1   20
0        1    A     0     1   20
0        1    A     0     0   10
1        1    A     0     1   10
2        1    A     1     0   10
3        1    A     1     1   10
4        1    B     0     0   10
5        1    B     0     1   10
6        1    B     1     0   10
7        1    B     1     1   10

powerset 计算直接取自 itertools文档。

关于python - 在 MultiIndex 级别和 groupby 上迭代 Pandas 以获取总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44080517/

相关文章:

python - 我不知道如何在数据库上执行 SUM 函数并将值存储到 python 变量中

python - 删除 Pandas 中索引未唯一标识的行

c++ - Python/C++ - 精度差异

python - 在 Python 3 CGI 脚本中设置编码

python - 仅对带有 Pandas 的字符串列应用转换,忽略数字数据

python - 按字母顺序对数据框中的每一行进行排序

python - 如果在 Pandas 中的字符串末尾,则删除某些字符

python - Pandas - 检查数据帧列是否包含键 :value pairs from a dictionary

python - wxPython的基础

python - 从 pyqtgraph.Qt 导入 QtGui 作为 *