使用apply, transform, agg - Python Pandas时如何引用groupby索引?
How to reference groupby index when using apply, transform, agg - Python 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
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中的date进行groupby,将每组中的A值相加,然后用df2中df2中对应日期的B值归一化。像这样
df1.groupby('date').agg(lambda x: np.sum(x)/df2.loc[x.date,'B'])
问题是aggregate、apply、transform都不能引用索引。知道如何解决这个问题吗?
> 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
当您调用 .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)
。
具体来说,假设我们有两个 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中的date进行groupby,将每组中的A值相加,然后用df2中df2中对应日期的B值归一化。像这样
df1.groupby('date').agg(lambda x: np.sum(x)/df2.loc[x.date,'B'])
问题是aggregate、apply、transform都不能引用索引。知道如何解决这个问题吗?
> 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
当您调用 .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)
。