如何按Pandas

时间:2017-07-28 13:49:41

标签: python pandas

我是熊猫的新手。我有以下数据集。 将数据集视为公司的部门('')和人员('')。

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

如果我按照dept /' 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

我的问题是如何只过滤按人/' k2'分组的平均值?这大于dept /''的平均值。它属于哪个。例如P1平均值大于它所属的X平均值

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

1 个答案:

答案 0 :(得分:3)

示例(已更改P6P5):

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

首先按groupbytransform创建新列:

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

然后按agg meanfirst进行汇总,还需要将k1列添加到groupby,以避免错误输出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

最后按boolean indexingquery过滤:

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添加reset_index

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