gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:53:05 26 4
gpt4 key购买 nike

给定一个样本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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com