Pandas groupby为每个系列定制功能

时间:2017-06-03 20:49:43

标签: python pandas numpy group-by

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

desired result
     Dataframe:
       one two
        a  3
        b  1

df.groupby(['一个'])[' 2&#39]。???

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

1 个答案:

答案 0 :(得分:7)

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

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。