Pandas groupby为每个系列定制功能

Nar*_*ati 2 python group-by numpy pandas

我很难将自定义函数应用于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)
Run Code Online (Sandbox Code Playgroud)

所以如果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

desired result
     Dataframe:
       one two
        a  3
        b  1
Run Code Online (Sandbox Code Playgroud)

df.groupby([ '一个'])[ '2'].???

我是熊猫新手.我读到groupby一次取每行的值,而不是完整的序列.因此我无法在groupby之后使用lambda.请帮忙!

ayh*_*han 10

使用自定义功能,您可以执行以下操作:

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

并重置索引:

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


    one  two
0   a    3
1   b    1
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

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

您的方法也可以使用以下方法:

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
Run Code Online (Sandbox Code Playgroud)

a = np.asarray(a)是必要的,否则你会得到KeyErrors b.append((a[i+1]-a[i])).