我想在数据框newcol
中创建一个新列df
作为
df.groupby('keycol').apply(somefunc)
显而易见:
df['newcol'] = df.groupby('keycol').apply(somefunc)
不起作用:df['newcol']
最终都包含所有nan
(这当然不是RHS评估的内容),或者引发了一些异常(异常的细节)根据{{1}}返回的内容而变化很大。
我尝试了上述的许多变体,包括像
这样的东西somefunc
他们都失败了。
唯一有效的方法是定义一个中间变量:
import pandas as pd
df['newcol'] = pd.Series(df.groupby('keycol').apply(somefunc), index=df.index)
有没有办法在不必创建中间变量的情况下实现这一目标?
(GroupBy.apply
的文档几乎没有内容。)
答案 0 :(得分:0)
让我们建立一个例子,我想我可以说明你的第一次尝试失败的原因:
示例数据:
n = 25
df = pd.DataFrame({'expenditure' : np.random.choice(['foo','bar'], n),
'groupid' : np.random.choice(['one','two'], n),
'coef' : randn(n)})
print df.head(10)
结果:
coef expenditure groupid
0 0.874076 bar one
1 -0.972586 foo two
2 -0.003457 bar one
3 -0.893106 bar one
4 -0.387922 bar two
5 -0.109405 bar two
6 1.275657 foo two
7 -0.318801 foo two
8 -1.134889 bar two
9 1.812964 foo two
因此,如果将简单函数mean
应用于分组数据,我们将得到以下结果:
df2= df.groupby('groupid').apply(mean)
print df2
这是:
coef
groupid
one -0.215539
two 0.149459
因此,上面的数据框由groupid
编制索引,并且有一列coef
。
您首先尝试做的事情实际上是:
df['newcol'] = df2
这为newcol
提供了所有NaN。老实说,我不知道为什么这不会引发错误。我不确定为什么它会产生任何东西。我认为你真正想要做的是将df2
合并回df
要合并df和df2,我们需要从df2中删除索引,重命名新列,然后合并:
df2= df.groupby('groupid').apply(mean)
df2.reset_index(inplace=True)
df2.columns = ['groupid','newcol']
df.merge(df2)
我认为就是你所追求的。
这是一种常见的习惯用法,Pandas包含transform
方法,将所有这些包装成更简单的语法:
df['newcol'] = df.groupby('groupid').transform(mean)
print df.head()
结果:
coef expenditure groupid newcol
0 1.705825 foo one -0.025112
1 -0.608750 bar one -0.025112
2 -1.215015 bar one -0.025112
3 -0.831478 foo two -0.073560
4 2.174040 bar one -0.025112
更好的文档是here。