使用Pandas将groupby聚合应用于原始数据框

时间:2017-10-15 06:13:35

标签: python pandas group-by

我想在电子表格中做一些看似很容易的事情,但我无法想象熊猫的语法。我有一个可以分组的数据集。我想确定每个组的聚合统计信息,然后使用聚合在原始数据框中创建一个新列。

例如,如果我的数据框如下所示:

d = pandas.dataframe({'class', : ['f1', 'f2', 'f3', 'f1'], 
'user': ['jack', 'jen', 'joe', 'jan'], 
'screen': [12, 23, 13, 15] })

是的,它远小于我的数据集

我想做点什么

d['gp'] = d['screen'].apply(d.groupby('class').stdev())

并确保d.groupby()。stdev()实际上是该行的该类的stdev。换句话说,我不希望在计算类f2等的gp时使用类f1的stdev。

我的大脑正在思考电子表格模式,或者在python循环中思考。我知道必须有一个简单的熊猫语法才能做到这一点 - 但到目前为止我还没有在我的搜索中找到任何符合我用例的内容。

2 个答案:

答案 0 :(得分:3)

对于返回Series,您需要transform,其长度与原始Dataframe相同:

d['gp'] = d.groupby('class')['screen'].transform('std')
print (d)
  class  screen  user       gp
0    f1      12  jack  2.12132
1    f2      23   jen      NaN
2    f3      13   joe      NaN
3    f1      15   jan  2.12132

您得到NaN,因为某些群组(f2f3)的长度等于1。

答案 1 :(得分:0)

我正在努力解决这个问题,并希望在定义我想要的内容时更准确一些。在我的数据集中,我有3组课程。我想确定每个班级的汇总统计数据;卑鄙,std dev。因此,如果我在dict-list上的pythonish伪代码中执行此操作,它将看起来像这样:

groupamean = mean(groupa ['screens']列表) groupastddev = stddev(groupa ['screens']列表)

对于groupa中的p,

:    x.append = groupa ['screens'] * groupamean + groupastdev

每组都会重复这一过程。这是普通python引导我思考的方式。

带有数据框对象的Pandas邀请了一种新的思考方式。很高兴不必使用for循环来完成一系列的事情。但我不知道如何确保当我应用groupby生成的聚合函数时,我得到了正确的组。

似乎接近的语法是这个

d['screengrade']= d['Screens Typed'].apply(lambda x: x / (classgroups.std + classgroups.mean) * 200 ) 

但是这会引发TypeError。