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

Posted

技术标签:

【中文标题】每个系列的 Pandas groupby 自定义功能【英文标题】:Pandas groupby custom function to each series 【发布时间】:2017-11-05 00:23:00 【问题描述】:

我很难将自定义函数应用于 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(['one'])['two'].???

我是熊猫新手。我读到 groupby 一次取每一行的值,而不是完整的系列。所以我不能在 groupby 之后使用 lambda。请帮忙!

【问题讨论】:

和问题无关,但是这个函数不就是把最后一个元素减去第一个元素除以n-1吗? 【参考方案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) 是必需的,否则你会在b.append((a[i+1]-a[i])) 中得到 KeyErrors。

【讨论】:

谢谢阿汉!快速提问:如果我只执行这部分“df.groupby('one')['two'].diff()”,它不会显示“one”列。输出仅显示索引和值。这是为什么?我知道显示“一个”是没有意义的,因为每对都会显示差异。 diff() 函数的属性是否不显示“一个”:) diffcumsum 等方法在 groupby 对象上调用时不会返回聚合结果。例如,如果您在示例中执行 groupby.sum,则结果将只有 a 和 b 行,但对于 diffcumsum,结果将有 5 行 - 与原始 DataFrame 相同。由于没有聚合,我们通常使用它们来分配回原始 DataFrame。这可能是分组列没有出现在返回对象中的原因。 听起来合乎逻辑。非常感谢:)

以上是关于每个系列的 Pandas groupby 自定义功能的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:是不是可以在 group by 中使用自定义功能

pandas groupby中的自定义聚合函数

提高性能(矢量化?) pandas.groupby.aggregate

HandsOnTable 编辑器自定义功能

WordPress 创建自定义功能

拦截电源关机按键自定义功能