gpt4 book ai didi

python pandas groupby/应用 : what exactly is passed to the apply function?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:46 25 4
gpt4 key购买 nike

这里是 Python 新手。我试图了解 pandas groupby 和 apply 方法的工作原理。我找到了 this简单的例子,我贴在下面:

import pandas as pd

ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}

df = pd.DataFrame(ipl_data)

数据框 df 如下所示:

      Team  Rank  Year  Points
0 Riders 1 2014 876
1 Riders 2 2015 789
2 Devils 2 2014 863
3 Devils 3 2015 673
4 Kings 3 2014 741
5 kings 4 2015 812
6 Kings 1 2016 756
7 Kings 1 2017 788
8 Riders 2 2016 694
9 Royals 4 2014 701
10 Royals 1 2015 804
11 Riders 2 2017 690

到目前为止,还不错。然后我想转换我的数据,以便从每组团队中我只保留 Points 列中的第一个元素。首先检查了 df['Points'][0] 确实给了我 df 的第一个 Points 元素,我尝试了这个:

df.groupby('Team').apply(lambda x : x['Points'][0])

认为 lambda 函数的参数 x 是另一个 pandas 数据帧。但是,python 会产生错误:

File "pandas/_libs/index.pyx", line 81, in pandas._libs.index.IndexEngine.get_value
File "pandas/_libs/index.pyx", line 89, in pandas._libs.index.IndexEngine.get_value
File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc
File "pandas/_libs/hashtable_class_helper.pxi", line 987, in pandas._libs.hashtable.Int64HashTable.get_item
File "pandas/_libs/hashtable_class_helper.pxi", line 993, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 0

这似乎与哈希表有关,但我不明白为什么。然后我想也许传递给 lambda 的不是数据帧,所以我运行了这个:

df.groupby('Team').apply(lambda x : (type(x), x.shape))

输出:

Team
Devils (<class 'pandas.core.frame.DataFrame'>, (2, 4))
Kings (<class 'pandas.core.frame.DataFrame'>, (3, 4))
Riders (<class 'pandas.core.frame.DataFrame'>, (4, 4))
Royals (<class 'pandas.core.frame.DataFrame'>, (2, 4))
kings (<class 'pandas.core.frame.DataFrame'>, (1, 4))
dtype: object

IIUC 表明 lambda 的参数确实是一个 pandas 数据框,其中包含每个团队的 df 子集。

我知道我可以通过运行得到想要的结果:

df.groupby('Team').apply(lambda x : x['Points'].iloc[0])

我只是想了解为什么 df['Points'][0] 有效而 x['Points'][0] 不在应用程序中功能。感谢阅读!

最佳答案

当您调用 df.groupby('Team').apply(lambda x: ...) 时,您实际上是按 Team 分割数据帧并将每个 block 传递给 lambda 函数:

      Team  Rank  Year  Points
0 Riders 1 2014 876
1 Riders 2 2015 789
8 Riders 2 2016 694
11 Riders 2 2017 690
------------------------------
2 Devils 2 2014 863
3 Devils 3 2015 673
------------------------------
4 Kings 3 2014 741
6 Kings 1 2016 756
7 Kings 1 2017 788
------------------------------
5 kings 4 2015 812
------------------------------
9 Royals 4 2014 701
10 Royals 1 2015 804

df['Points'][0] 之所以有效,是因为您告诉 pandas“获取 Points 系列标签 0 处的值”,该值存在。

.apply(lambda x: x['Points'][0]) 不起作用,因为只有 1 个 block (Riders)有标签 0。因此你得到关键错误。


话虽如此,apply 是通用的,因此与内置的矢量化聚合函数相比它非常慢。您可以使用 first:

df.groupby('Team')['Points'].first()

关于python pandas groupby/应用 : what exactly is passed to the apply function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57747894/

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