如何在使用apply、transform、agg时引用groupby索引 - Python Pandas?

6
要具体说明,假设我们有两个数据框:
df1:
    date    A
0   12/1/14 3
1   12/1/14 1
2   12/3/14 2
3   12/3/14 3
4   12/3/14 4
5   12/6/14 5

df2:

        B
12/1/14 10
12/2/14 20
12/3/14 10
12/4/14 30
12/5/14 10
12/6/14 20

现在我想按df1中的日期进行分组,并对每个组中的A值求和,然后通过df2中相应日期中B值的归一化来计算。类似这样:
df1.groupby('date').agg(lambda x: np.sum(x)/df2.loc[x.date,'B'])

问题在于聚合(aggregate)、应用(apply)和转换(transform)都无法引用索引。有什么解决办法吗?
2个回答

7
当您调用.groupby('column')时,它会使column成为DataFrameGroupBy的一部分索引,并且可以通过.index属性访问。
因此,在您的情况下,假设datedf中都不是索引的一部分,则应该按如下方式操作:
def f(x):
    return x.sum() / df2.set_index('date').loc[x.index[0], 'B']

df1.set_index('date').groupby(level='date').apply(f)

这将产生:
               A
date            
2014-01-12  0.40
2014-03-12  0.90
2014-06-12  0.25

如果date在df2的索引中 - 只需在上面的代码中使用df2.loc[x.index[0],'B']
如果datedf1.index中,则将最后一行更改为df1.groupby(level='date').apply(f)

0
> df_grouped = df1.groupby('date').sum()
> print df_grouped['A'] / df2['B'].astype(float)
date
12/1/14    0.40
12/2/14     NaN
12/3/14    0.90
12/4/14     NaN
12/5/14     NaN
12/6/14    0.25
dtype: float64

3
这篇文章目前处于低质量队列中,请提供一些解释。 - Bill Woodger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接