我有一个像这样的 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
,但这也是不允许的。
您可以
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