python - 为什么在使用 DataFrameGroupBy.agg 时可以访问传递给聚合函数的系列中的所有数据框列?
问题描述
我在玩弄我无法解释的对象的方法apply
和agg
方法时进行了观察。DataFrameGroupBy
介绍
我理解以下代码,但它可能对问题的介绍很有用。
我正在分组DataFrame
my_df
key col0 col1
0 1 A B
1 1 C D
2 2 E F
3 2 G H
按'key'
列,然后apply
按功能
def func(df):
return ''.join(df['col0'] + df['col1'])
产生
>>> my_df.groupby('key').apply(func)
key
1 ABCD
2 EFGH
dtype: object
这按预期工作。我可以访问这些列'col0'
,因为使用时'col1'
传递的“分组块”是数据帧。func
apply
问题
我不明白为什么在使用而不是使用相同的功能KeyError
时会引发no 。agg
apply
>>> my_df.groupby('key').agg(func)
col0 col1
key
1 ABCD ABCD
2 EFGH EFGH
据我了解,当使用agg
then时,为 的每一列的每个组func
传递一个,所以参数应该是 type ,并且试图做并且应该产生一个.Series
my_df
df
Series
df['col0']
df['col1']
KeyError
为什么会agg
产生结果?我的在哪里KeyError
?
研究
我确认这df
是一个Series
不能用调试器df['col0']
和df['col1']
调试器索引的。
然而my_df.groupby('key').agg(func)
神奇地起作用。
设置:
from IPython.core.debugger import Pdb
import sys
def set_trace():
Pdb().set_trace(sys._getframe().f_back)
def func(df):
set_trace()
return ''.join(df['col0'] + df['col1'])
用法:
>>> my_df.groupby('key').agg(func)
> <ipython-input-258-9f34bde72bce>(9)func()
6
7 def func(df):
8 set_trace()
----> 9 return ''.join(df['col0'] + df['col1'])
10
ipdb> type(df)
<class 'pandas.core.series.Series'>
ipdb> df
0 A
1 C
Name: col0, dtype: object
ipdb> df['col0']
*** KeyError: 'col0'
ipdb> df['col1']
*** KeyError: 'col1'
解决方案
它实际上确实引发了 a KeyError
,您可以在将访问包装在时看到try/except
:
In [23]: def func(df):
...: print(type(df))
...: print(df)
...: print()
...: try:
...: df['col0']
...: except KeyError:
...: print('[Error]')
...: return ''.join(df['col0'] + df['col1'])
...:
...:
In [24]: df.groupby('key').agg(func)
<class 'pandas.core.series.Series'>
0 A
1 C
Name: col0, dtype: object
[Error]
<class 'pandas.core.series.Series'>
0 A
1 C
Name: col0, dtype: object
[Error]
<class 'pandas.core.series.Series'>
0 A
1 C
Name: 1, dtype: object
[Error]
<class 'pandas.core.frame.DataFrame'>
key col0 col1
0 1 A B
1 1 C D
<class 'pandas.core.frame.DataFrame'>
key col0 col1
2 2 E F
3 2 G H
这KeyError
似乎被调用函数排除在外,因此它被静音了。
检查一些源代码表明agg
实际上调用了这个函数。从这里它首先进入这个函数,它返回None
ifarg
是一个函数(这是我们的例子)。最后它会在这里try / except Exception
执行。
推荐阅读
- c# - 我应该处置不属于自己的实例吗?
- winforms - WInform DataGridView 到 Datetimepicker C#
- android - 如何在 Firebase 中显示示例(3 和 7)之间的类别?
- postgresql - 当数据库位于同一 postgres 服务器中时,如何查询两个 postgres 数据库(使用单个查询)?
- angularjs - 使用 ngModel 将 AngularJS 指令升级为 Angular 组件
- spring-webflux - 如何使用 Spring Webflux 创建列表流?
- google-play - Google Play 上的应用提供的订阅产品是否可以在任何地方公开显示?
- amazon-web-services - 实施 AWS Lambda 的首选请求处理程序接口
- javascript - 如何通过 jQuery 替换一段字符串?
- r - 在 *for* 函数中,我可以保持堆叠值吗?