如何过滤Pandas中的分组

2024-09-27 20:19:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我是熊猫的新手。我有以下数据集。 把数据集想象成公司的部门(k1)和人员(k2)。你知道吗

dframe = pd.DataFrame({'k1': ['X','X','Y','Y','Z','Z'],
   ...:                         'k2': ['P1','P2','P3','P4','P5','P6'],
   ...:                          'dataset1': np.random.randn(6)})
   ...:

如果我取按部门/k1分组的平均值,我得到以下结果

   dataset1
k1
X   0.153825
Y  -0.648500
Z   1.133334

如果我取按人/k2分组的平均值,我得到以下结果

In [6]: dframe.groupby('k2').mean()
Out[6]:
    dataset1
k2
P1  1.595455
P2 -1.287805
P3  0.211858
P4 -1.508859
P5  1.350336
P6  0.916332

我的问题是,如何只过滤按people/'k2'分组的平均值,它大于dept/'k1'所属的平均值。e、 g.P1平均值大于其所属的X平均值

Out[6]:
    dataset1
k2
P1  1.595455
P3  0.211858
P5  1.350336

Tags: 数据k2k1out部门平均值p2p3
1条回答
网友
1楼 · 发布于 2024-09-27 20:19:08

示例(将P6更改为P5):

np.random.seed(45)
dframe = pd.DataFrame({'k1': ['X','X','Y','Y','Z','Z'],
                         'k2': ['P1','P2','P3','P4','P5','P5'],
                            'dataset1': np.random.randn(6)})

print (dframe)
   dataset1 k1  k2
0  0.026375  X  P1
1  0.260322  X  P2
2 -0.395146  Y  P3
3 -0.204301  Y  P4
4 -1.271633  Z  P5
5 -2.596879  Z  P5

首先通过^{}^{}创建新列:

dframe['meank1'] = dframe.groupby('k1').transform('mean')
print (dframe)
   dataset1 k1  k2    meank1
0  0.026375  X  P1  0.143348
1  0.260322  X  P2  0.143348
2 -0.395146  Y  P3 -0.299723
3 -0.204301  Y  P4 -0.299723
4 -1.271633  Z  P5 -1.934256
5 -2.596879  Z  P5 -1.934256

然后通过^{}mean^{}进行聚合,也有必要在k1列中添加k1列,以避免相同的k2在另一个k1中输出错误。你知道吗

dframe = dframe.groupby(['k1','k2']).agg({'dataset1':'mean', 'meank1':'first'})
print (dframe)
         meank1  dataset1
k1 k2                    
X  P1  0.143348  0.026375
   P2  0.143348  0.260322
Y  P3 -0.299723 -0.395146
   P4 -0.299723 -0.204301
Z  P5 -1.934256 -1.934256

上次按^{}^{}筛选:

dframe = dframe.loc[dframe['meank1'] > dframe['dataset1'], ['dataset1']]
#alternative sol
#dframe = dframe.query('meank1 > dataset1')[['dataset1']]
print (dframe)
       dataset1
k1 k2          
X  P1  0.026375
Y  P3 -0.395146

如果要删除第一级MultiIndex添加^{}

dframe = dframe.reset_index(level=0, drop=True)
print (dframe)
    dataset1
k2          
P1  0.026375
P3 -0.395146

对于索引中的列,请使用:

dframe = dframe.reset_index(level=0, drop=True).reset_index()
print (dframe)
   k2  dataset1
0  P1  0.026375
1  P3 -0.395146

相关问题 更多 >

    热门问题