我是熊猫的新手。我有以下数据集。 将数据集视为公司的部门('')和人员('')。
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
答案 0 :(得分:3)
示例(已更改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
然后按agg
mean
和first
进行汇总,还需要将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 indexing
或query
过滤:
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