Pandas 对分类变量的滚动函数

问题描述 投票:0回答:1

我有一个像这样的 pandas 数据框

group cat
1     0
2     0
1     0
1     1
2     0
2     1 
1     2
1     2

我尝试按

group
对数据进行分组,然后将自定义函数应用于过去 5 行。 自定义函数看起来像这样

def unalikeability(data):

    num_observations = data.shape[0]
    counts = data.value_counts()

    return 1 - ((counts / num_observations)**2).sum()

所需输出:

group unalikeability
1     result calculated by the function
1
1
1
2
2
2
2

我可以使用

groupby().rolling()
获取过去 5 行,但是 pandas 中的
rolling
对象没有像 DataFrame 那样的
shape
/
value_counts
属性和方法。我尝试从滚动对象创建
DataFrame
,但这也是不允许的。

pandas dataframe group-by rolling-computation
1个回答
0
投票

您可以

apply
您的功能。根据您是否希望仅在完整块(5 个值)或任意大小的块上计算输出,请使用
min_periods
:

unalikeability(data):

    num_observations = data.shape[0]
    counts = data.value_counts()

    return 1 - ((counts / num_observations)**2).sum()

df['out1'] = (df.groupby('group')
                .rolling(5)['cat']
                .apply(unalikeability)
                .droplevel('group')
              )

df['out2'] = (df.groupby('group')
                .rolling(5, min_periods=1)['cat']
                .apply(unalikeability)
                .droplevel('group')
              )

输出:

   group  cat  out1      out2
0      1    0   NaN  0.000000
1      2    0   NaN  0.000000
2      1    0   NaN  0.000000
3      1    1   NaN  0.444444
4      2    0   NaN  0.000000
5      2    1   NaN  0.444444
6      1    2   NaN  0.625000
7      1    2  0.64  0.640000
© www.soinside.com 2019 - 2024. All rights reserved.