使用Pandas的groupby函数对每个系列应用自定义函数。

16
我在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'].???

我对pandas还不熟悉。我了解到groupby是逐行处理数值,而不是整个系列。所以我不能在groupby之后使用lambda函数。

1
这个函数难道不是将最后一个元素减去第一个元素,然后除以n-1吗? - Vincenzooo
1个回答

25

通过使用自定义函数,您可以实现以下功能:

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) 的作用是避免在 b.append((a[i+1]-a[i])) 中出现 KeyError 错误。


谢谢ayhan!有个小问题:如果我只执行这一部分 "df.groupby('one')['two'].diff()",它不显示列'one'。输出只显示索引和值。为什么呢?我知道显示'one'没有意义,因为差异是针对每对显示的。是diff()函数不显示'one'的属性吗 :) - Naresh Ambati
diffcumsum 这样的方法在调用 groupby 对象时不会返回聚合结果。例如,如果您在示例中执行 groupby.sum,则结果仅具有 a 和 b 两行,但对于 diffcumsum,结果将具有 5 行 - 与原始 DataFrame 相同。由于没有聚合,我们通常使用它们分配回原始 DataFrame。这可能是为什么分组列不显示在返回对象中的原因。 - ayhan
听起来很合理。非常感谢 :) - Naresh Ambati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接