numpy Pandas groupby自定义函数到每个系列

mklgxw1f  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(95)

我很难将自定义函数应用于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。

q9rjltbz

q9rjltbz1#

使用自定义函数,您可以:

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]))中获得KeyErrors。

相关问题