gpt4 book ai didi

python - 将函数应用于 groupby 函数

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:48 24 4
gpt4 key购买 nike

我想在 groupby 上计算有多少一致增加,以及第一个元素和最后一个元素之间的差异。但我无法在 groupby 上应用该功能。 groupby之后是list吗?还有“apply”和“agg”之间的区别是什么?不好意思,刚接触python几天。

def promotion(ls):
pro =0
if len(ls)>1:
for j in range(1,len(ls)):
if ls[j]>ls[j-1]:
pro + = 1
return pro
def growth(ls):
head= ls[0]
tail= ls[len(ls)-1]
gro= tail-head
return gro
titlePromotion= JobData.groupby("candidate_id")["TitleLevel"].apply(promotion)
titleGrowth= JobData.groupby("candidate_id")["TitleLevel"].apply(growth)

数据是:

candidate_id    TitleLevel     othercols
1 2 foo
2 1 bar
2 2 goo
2 1 gar
The result should be
titlePromotion
candidate_id
1 0
2 1
titleGrowth
candidate_id
1 0
2 0

最佳答案

import pandas as pd

def promotion(ls):
return (ls.diff() > 0).sum()

def growth(ls):
return ls.iloc[-1] - ls.iloc[0]

jobData = pd.DataFrame(
{'candidate_id': [1, 2, 2, 2],
'TitleLevel': [2, 1, 2, 1]})

grouped = jobData.groupby("candidate_id")
titlePromotion = grouped["TitleLevel"].agg(promotion)
print(titlePromotion)
# candidate_id
# 1 0
# 2 1
# dtype: int64

titleGrowth = grouped["TitleLevel"].agg(growth)
print(titleGrowth)
# candidate_id
# 1 0
# 2 0
# dtype: int64

一些提示:

如果定义泛型函数

def foo(ls):
print(type(ls))

并调用

jobData.groupby("candidate_id")["TitleLevel"].apply(foo)

Python 将打印

<class 'pandas.core.series.Series'>

这是发现调用 jobData.groupby(...)[...].apply(foo) 传递 Seriesfoo


apply 方法为每个组调用一次 foo。它可以返回一个 Series 或 DataFrame,并将结果 block 粘合在一起。当 foo 返回一个对象,例如数值或字符串时,可以使用 apply,但在这种情况下,我认为使用 agg 是首选.使用 apply 的一个典型用例是当您想要对一组中的每个值进行平方运算并因此需要返回一个具有相同形状的新组时。

transform 方法在这种情况下也很有用——当您想要转换组中的每个值并因此需要返回相同形状的东西时——但结果可能与 apply 不同,因为不同的对象可能会传递给 foo (例如,分组数据帧的每一列都将传递给 foo 当使用 transform 时,整个组将被传递给 foo 当使用 apply 时。最简单的理解方式是试验一个简单的数据框和通用的 foo。)

agg 方法为每个组调用一次 foo,但与 apply 不同的是,它应该为每个组返回一个数字。该组被聚合成一个值。使用 agg 的典型用例是当您想要计算组中项目的数量时。


您可以使用通用的 foo 函数调试并了解原始代码出了什么问题:

In [30]: grouped['TitleLevel'].apply(foo)
0 2
Name: 1, dtype: int64
--------------------------------------------------------------------------------
1 1
2 2
3 1
Name: 2, dtype: int64
--------------------------------------------------------------------------------
Out[30]:
candidate_id
1 None
2 None
dtype: object

这显示了传递给 foo 的系列。请注意,在第二个系列中,索引值为 1 和 2。因此 ls[0] 引发了一个 KeyError,因为没有值为 0< 的标签 在第二个系列中。

您真正想要的是系列中的第一项。这就是 iloc 的用途。

总结一下,使用 ls[label] 选择索引值为 label 的 Series 行。使用 ls.iloc[n] 选择系列的第 n 行。

因此,要以最少的更改修复您的代码,您可以使用

def promotion(ls):
pro =0
if len(ls)>1:
for j in range(1,len(ls)):
if ls.iloc[j]>ls.iloc[j-1]:
pro += 1
return pro
def growth(ls):
head= ls.iloc[0]
tail= ls.iloc[len(ls)-1]
gro= tail-head
return gro

关于python - 将函数应用于 groupby 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153307/

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