python - 在对 groupby 执行求和后保留输出中的列

标签 python pandas group-by

给定一个样本df:

df = pd.DataFrame([['William', 1, 0, 'T', 0, 1],['James', 0, 1, 'R', 1, 1],['James', 1, 0, 'S', 0, 1],['Dean', 1, 0, 'R', 1, 0],['William', 0, 1, 'S', 0, 0],['James', 0, 0, 'S', 0, 1]],columns=['Name','x1','x2','x3','x4','x5']) 

      Name  x1  x2 x3  x4  x5
0  William   1   0  T   0   1
1    James   0   1  R   1   1
2    James   1   0  S   0   1
3     Dean   1   0  R   1   0
4  William   0   1  S   0   0
5    James   0   0  S   0   1

我之前问过一个问题,关于如何将各种过滤器应用到此 df 并输出应用于 groupby 中每个组对象的一系列函数的结果,我得出了以下解决方案:

variables = {'x1': 'sum','x2': 'sum','x4': 'sum','x5': 'sum'}
filters = {'Option1': df['x3']=='S', 'Option2': df['x3']=='R', 'Option3': (df['x2']==1) | (df['x4']==1) | (df['x5']==1), 'Option4': df['x2']==1, 'Option5': df['x2']==0, 'Option6': df['x5']==1}

out = {key: df[f].groupby('Name').agg(variables) for key, f in filters.items()}

out = pd.concat(results)

连接结果后,我剩下以下内容:

                 x1  x2  x4  x5
        Name                   
Option1 James     1   0   0   2
        William   0   1   0   0
Option2 Dean      1   0   1   0
        James     0   1   1   1
Option3 Dean      1   0   1   0
        James     1   1   1   3
        William   1   1   0   1
Option4 James     0   1   1   1
        William   0   1   0   0
Option5 Dean      1   0   1   0
        James     1   0   0   2
        William   1   0   0   1
Option6 James     1   1   1   3
        William   1   0   0   1

我想再次 groupby('Name'),这给了我:

              x1  x2  x4  x5
        Name                
Option2 Dean   1   0   1   0
Option3 Dean   1   0   1   0
Option5 Dean   1   0   1   0 


               x1  x2  x4  x5
        Name                 
Option1 James   1   0   0   2
Option2 James   0   1   1   1
Option3 James   1   1   1   3
Option4 James   0   1   1   1
Option5 James   1   0   0   2
Option6 James   1   1   1   3 


                 x1  x2  x4  x5
        Name                   
Option1 William   0   1   0   0
Option3 William   1   1   0   1
Option4 William   0   1   0   0
Option5 William   1   0   0   1
Option6 William   1   0   0   1 

但是我有一些列(或行,取决于你如何看待它)被排除在结果之外(例如过滤器 df['x3']=='S' 将保留 Name 列,不包含 'Dean' 的实例)。我觉得我真的很接近这里,但这是我想要的输出(名称的排序不相关):

                  x1  x2  x4  x5
Name                   
James   Option1   1   0   0   2
        Option2   0   1   1   1
        Option3   1   1   1   3
        Option4   0   1   1   1
        Option5   1   0   0   2
        Option6   1   1   1   3
Dean    Option1   0   0   0   0
        Option2   1   0   1   0
        Option3   1   0   1   0
        Option4   0   0   0   0
        Option5   1   0   1   0
        Option6   0   0   0   0
William Option1   0   1   0   0
        Option2   0   0   0   0
        Option3   1   1   0   1
        Option4   0   1   0   0
        Option5   1   0   0   1
        Option6   1   0   0   1

感谢您的指点。

最佳答案

您可以通过重新索引您的 out DataFrame 并交换索引的级别来完成您想要的。从连接的结果开始:

from itertools import product

# Swap the index levels
out = out.swaplevel(0,1)

# Form the product of the two index levels
ids = list(product(out.index.get_level_values(0).unique(), 
                   out.index.get_level_values(1).unique()))

# Reindex out, filling missing with 0 and sorting the index
out = out.reindex(ids).fillna(0).sort_index().astype('int')

out 现在是:

                 x1  x2  x4  x5
Name                           
Dean    Option1   0   0   0   0
        Option2   1   0   1   0
        Option3   1   0   1   0
        Option4   0   0   0   0
        Option5   1   0   1   0
        Option6   0   0   0   0
James   Option1   1   0   0   2
        Option2   0   1   1   1
        Option3   1   1   1   3
        Option4   0   1   1   1
        Option5   1   0   0   2
        Option6   1   1   1   3
William Option1   0   1   0   0
        Option2   0   0   0   0
        Option3   1   1   0   1
        Option4   0   1   0   0
        Option5   1   0   0   1
        Option6   1   0   0   1

关于python - 在对 groupby 执行求和后保留输出中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50994949/

相关文章:

Python 和 Pandas - 使用相同的中断删除多个文件中的页脚

python 按周或按月拆分 pandas 数据框,并根据这些 sp 对数据进行分组

python - Pandas : float 的差异

python - 添加前缀失败并显示百分比

python - 查找(bash 命令)不适用于子进程?

Python:消除额外的逗号(错误标记数据。C 错误:第 29 行中预期有 3 个字段,看到了 4)

SQL选择并按一段时间(时间戳)分组

r - 使用 dplyr 对 R 中的组进行索引

python - 无法在抢占状态下重新启动 TPU 节点

python - 从 Python 中的文本文件导入方程