gpt4 book ai didi

python - 为什么使用 DataFrameGroupBy.agg 时可以访问传递给聚合函数的系列中的所有数据帧列?

转载 作者:行者123 更新时间:2023-11-28 21:33:51 25 4
gpt4 key购买 nike

我在玩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'因为“分组 block ”传递到 func当使用apply时是数据框。


问题

我不明白为什么没有KeyError使用 agg 时引发而不是apply具有相同的功能。

>>> my_df.groupby('key').agg(func)                                     
col0 col1
key
1 ABCD ABCD
2 EFGH EFGH

据我了解,当使用 agg 时然后func通过了 Series 对于 my_df 的每列的每个组 ,所以df参数的类型应为 Series ,并尝试做df['col0']df['col1']应该产生 KeyError .

为什么agg产生结果?我的KeyError在哪里?


研究

我确认dfSeries无法使用 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'

最佳答案

它实际上确实引发了一个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 实际上调用 this function 。从这里首先转到 this function如果 arg 是一个函数(这就是我们的情况),则返回 None。最后它出现了here其中执行 try/except Exception

关于python - 为什么使用 DataFrameGroupBy.agg 时可以访问传递给聚合函数的系列中的所有数据帧列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54173484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com