Eu tenho um dataframe Pandas que se parece com
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'])
E eu quero criar uma nova linha chamada PreviousMean
. Esta coluna é a média do ano até a data de DPD para aquele cliente. ou seja, inclui todos os DPDs até, mas não incluindo, as linhas que correspondem à data de depósito atual. Se nenhum registro anterior existia, então é nulo ou 0.
Então o resultado desejado parece ser
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
E depois de alguma pesquisa no site e na internet aqui está uma solução:
df['PreviousMean'] = df.apply(
lambda x: df[(df.Customer == x.Customer) & (df.Deposit_Date < x.Deposit_Date)].DPD.mean(),
axis=1)
E funciona bem. No entanto, meu datafram real é muito maior (~1 milhão de linhas) e o código acima é muito lento. Existe alguma maneira melhor de fazer isso? Obrigado
Tente usar
expanding
! Aqui está um exemplo:Você pode usar um
groupby.apply
with personalizadoexpanding.mean
e ummask
on naduplicated
data paraffill
a saída:NB: isto pressupõe que as datas estejam classificadas.
Saída:
Intermediários:
Aqui está uma versão mais otimizada do código, reduzindo operações redundantes, como classificação dentro de cada grupo, e simplificando o cálculo de expansão: