Pandas groupby 自定义功能到每个系列

Pandas groupby custom function to each series

提问人:Naresh Ambati 提问时间:6/4/2017 最后编辑:Timur ShtatlandNaresh Ambati 更新时间:11/18/2023 访问量:32594

问:

我很难将自定义函数应用于 Pandas 中的每组列groupby

我的自定义函数接受一系列数字,并取连续对的差值,并返回所有差值的平均值。代码如下:

def mean_gap(a):
    b = []
    for i in range(0, len(a)-1):
        b.append((a[i+1]-a[i]))
    return np.mean(b)

所以如果,会给我a = [1,3,7]mean_gap(a)((3-1)+(7-3))/2) = 3.0

 Dataframe:
   one two
    a  1
    a  3
    a  7
    b  8
    b  9

期望的结果:

     Dataframe:
       one two
        a  3
        b  1

df.groupby(['one'])['two'].???

我是熊猫的新手。我读到一次每行取值,而不是整个系列。所以我不能在 .groupbygroupby

熊猫 麻木 分组依据

评论

1赞 Vincenzooo 4/27/2021
这与问题无关,但这个函数不就等于从最后一个元素中减去第一个元素并除以 n-1 吗?

答:

25赞 ayhan 6/4/2017 #1

使用自定义函数,您可以执行以下操作:

df.groupby('one')['two'].agg(lambda x: x.diff().mean())
one
a    3
b    1
Name: two, dtype: int64

并重置索引:

df.groupby('one')['two'].agg(lambda x: x.diff().mean()).reset_index(name='two')


    one  two
0   a    3
1   b    1

另一种选择是:

df.groupby('one')['two'].diff().groupby(df['one']).mean()
one
a    3.0
b    1.0
Name: two, dtype: float64

您的方法也适用于以下方法:

def mean_gap(a):
    b = []
    a = np.asarray(a)
    for i in range(0, len(a)-1):
        b.append((a[i+1]-a[i]))
    return np.mean(b) 

df.groupby('one')['two'].agg(mean_gap)
one
a    3
b    1
Name: two, dtype: int64

a = np.asarray(a)是必需的,否则您将在 中得到 KeyErrors。b.append((a[i+1]-a[i]))

评论

0赞 Naresh Ambati 6/4/2017
谢谢ayhan!快速问题:如果我只执行这部分“df.groupby('one')['two'].diff()”,它不会显示列'one'。输出仅显示索引和值。为什么?我知道显示“一”是没有意义的,因为每对都显示了差异。diff() 函数的属性是不显示“一个”:)
0赞 ayhan 6/4/2017
像 这样的方法在对 groupby 对象调用时不会返回聚合结果。例如,如果在示例中执行,则结果将只有行 a 和 b,但 for 和 结果将有 5 行 - 与原始 DataFrame 相同。由于没有聚合,我们通常使用它们来分配回原始 DataFrame。这可能就是分组列未显示在返回对象中的原因。diffcumsumgroupby.sumdiffcumsum
0赞 Naresh Ambati 6/4/2017
听起来很合乎逻辑。非常感谢:)