对于这个问题,我想计算具有3年时间窗口的特定成员的平均值。例如以下数据帧:
member_id | 特征1 | 特征2 | 特征3 | 日期 | 1 | 0.1 | 0.5 | 0.2 | 1/2/20 | 1
---|---|---|---|---|
0.2 | 0.3 | 0.3 | 1/2/18 | |
0.3 | 0.2 | 0.2 | 1/2/16 | |
0.1 | 0.2 | 0.1 | 1/4/17 | |
0.4 | 0.1 | 0.4 | 1/2/18 | |
0.5 | 0.1 | 0.2 | 1/2/15 |
按如下步骤进行:
-
定义一个函数来获取特定行的平均特征当前组,所需时间段:
def getRowMeans(row, grp): dTo = row.Date return grp[grp.Date.between(dTo - pd.DateOffset(years=3), dTo)] .loc[:, 'Feature 1' : 'Feature 3'].mean()
思路是:
- 当前对象是行,来自一组行(对于某些member_id,
- 对于整个集团以下的操作也必须是已知的;所以它是这个函数的另一个参数(grp),
- fromgrp从日期获取之前3年的行当前行(包括此日期),
- 从这些行中获取所有3特征列并返回它们的平均值。
-
定义一个函数,为每组行调用(对于某些member_id),返回包含所有Feature列的该组的副本替换为它们的方法(由getRowMeans生成):
def FeaturesToMeans(grp): means = grp.apply(getRowMeans, axis=1, grp=grp) rv = grp.copy() rv.update(means) return rv
第一步是计算特征均值。
为了不改变原组,对象必须是finally返回的(rv)必须创建为副本
然后用刚刚计算的means更新。但是请注意update在的位置操作并且不返回任何值结果。
返回的对象是更新后的组。
-
生成实际结果,作为一个新的DataFrame:
result = df.groupby('member_id', group_keys=False).apply(FeaturesToMeans)
对于您的示例数据,结果为:
member_id Feature 1 Feature 2 Feature 3 Date
0 1 0.133333 0.333333 0.20 2020-01-02
1 1 0.200000 0.233333 0.20 2018-01-02
2 1 0.300000 0.200000 0.20 2016-01-02
3 1 0.200000 0.200000 0.15 2017-01-04
4 2 0.450000 0.100000 0.30 2018-01-02
5 2 0.500000 0.100000 0.20 2015-01-02