我有一个 Pandas 数据框,看起来像
df = pd.DataFrame([['John', '1/1/2017','10'],
['John', '2/2/2017','15'],
['John', '2/2/2017','20'],
['John', '3/3/2017','30'],
['Sue', '1/1/2017','10'],
['Sue', '2/2/2017','15'],
['Sue', '3/2/2017','20'],
['Sue', '3/3/2017','7'],
['Sue', '4/4/2017','20']],
columns=['Customer', 'Deposit_Date','DPD'])
我想创建一个名为 的新行PreviousMean
。此列是该客户今年迄今为止的 DPD 平均值。即包括所有 DPD,但不包括与当前存款日期匹配的行。如果不存在以前的记录,则为空或 0。
因此期望的结果如下
Customer Deposit_Date DPD PreviousMean
0 John 2017-01-01 10 NaN
1 John 2017-02-02 15 10.0
2 John 2017-02-02 20 10.0
3 John 2017-03-03 30 15.0
4 Sue 2017-01-01 10 NaN
5 Sue 2017-02-02 15 10.0
6 Sue 2017-03-02 20 12.5
7 Sue 2017-03-03 7 15.0
8 Sue 2017-04-04 20 13.0
在网站和互联网上进行一些研究后,找到了一个解决方案:
df['PreviousMean'] = df.apply(
lambda x: df[(df.Customer == x.Customer) & (df.Deposit_Date < x.Deposit_Date)].DPD.mean(),
axis=1)
并且运行良好。但是,我的实际数据帧要大得多(约 100 万行),上面的代码运行非常慢。有没有更好的方法?谢谢
尝试使用
expanding
!这里是示例:您可以在输出日期时使用自定义的
groupby.apply
withexpanding.mean
和 a :mask
duplicated
ffill
注意:这是假设日期已排序。
输出:
中间体:
下面是更加优化后的版本代码,减少了组内排序等冗余操作,简化了扩展计算: