我想在电子表格中做一些看似很容易的事情,但我无法想象熊猫的语法。我有一个可以分组的数据集。我想确定每个组的聚合统计信息,然后使用聚合在原始数据框中创建一个新列。
例如,如果我的数据框如下所示:
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循环中思考。我知道必须有一个简单的熊猫语法才能做到这一点 - 但到目前为止我还没有在我的搜索中找到任何符合我用例的内容。
答案 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
,因为某些群组(f2
,f3
)的长度等于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。