2017-10-15 55 views
0

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

例如,如果我的数据帧是这样的:

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 for循环思考。我知道必须有一个简单的熊猫语法才能做到这一点 - 但到目前为止,我没有在我的搜索中找到任何似乎符合我的用例的东西。

回答

1

看来你需要transform与相同长度的原始Dataframe回报Series

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 S,因为一些群体(f2f3)具有长度等于1

+1

没错。我有我的信 – Dark

+0

不一样的信。我需要将聚合操作应用于原始数据框。但每个同意op(平均值,标准开发)必须为每个组计算 - 因此该组按 –

+0

您是否需要'd ['screengrade'] = d.groupby('class')['screen']。transform lambda x:x /(x.std()+ x.mean())* 200)'?我只用手机,所以未经测试。 – jezrael

0

我我在这方面做了一些工作,并希望在定义我想要的东西时更精确一些。在我的数据集中,我有3组类。我想确定每个班级的综合统计数据;意思是说,std dev。因此,如果我在字典列表中使用pythonish伪代码,它看起来像这样:

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

对于p在A组: x.append = A组[' 屏幕] * groupamean + groupastdev

这将被重复用于每个组。这是普通Python引导我思考的方式。

大熊猫与数据框对象邀请一种新的思维方式。它不需要使用for循环来完成一系列的事情。但我不知道如何确保在应用groupby生成的聚合函数时,我可以得到正确的组。

似乎亲近的语法是这样的

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

但是,这将引发一个类型错误。

+0

越来越接近TypeError,因为classgroups.std是一个函数,我应该调用它 - –