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

Osi*_*ris 6 python group-by aggregate dataframe pandas

具体来说,假设我们有两个 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在我想对 df1 中的日期进行分组,并对每组中的值 A 求和,然后通过相应日期中 df2 中的 B 值对其进行标准化。像这样的东西

df1.groupby('date').agg(lambda x: np.sum(x)/df2.loc[x.date,'B'])
Run Code Online (Sandbox Code Playgroud)

问题是无论是aggregate、apply还是transform都不能引用索引。知道如何解决这个问题吗?

Pri*_*mer 7

当您调用它时.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)
Run Code Online (Sandbox Code Playgroud)

这会产生:

               A
date            
2014-01-12  0.40
2014-03-12  0.90
2014-06-12  0.25
Run Code Online (Sandbox Code Playgroud)

如果date在 df2 的索引中 - 只需df2.loc[x.index[0], 'B']在上面的代码中使用。

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