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

时间:2015-05-13 16:58:36

标签: python pandas group-by dataframe aggregate

具体来说,我们有两个DataFrame:

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'])

问题是聚合,应用和转换都不能引用索引。知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

当您致电.groupby('column')时,它会使column成为DataFrameGroupBy索引的一部分。它可以通过.index属性访问。

因此,在您的情况下,假设date不是df中的索引的一部分,这应该有效:

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']

如果date位于df1.index,请将最后一行更改为df1.groupby(level='date').apply(f)

答案 1 :(得分: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