Lidando com valores None ao usar o Pandas Groupby e Apply with a Function
eu tenho umDataframe
noPandas
com uma letra e duas datas como colunas. Gostaria de calcular os dias úteis entre as duas colunas de data da linha anterior usandoshift()
, desde que oLetter
o valor é o mesmo (usando um.groupby()
) Eu estava fazendo isso com.apply()
. Isso funcionou até eu passar alguns dados nos quais faltava uma das datas. Mudei tudo para uma função para lidar com o valor que faltava com umtry/except
, mas agora minha função retornaNaN
para tudo. Parece que oNone
O valor de data está impactando cada chamada da função, enquanto eu pensaria que só faria isso quando oLetter
de.groupby()
éA
.
import pandas as pd
from datetime import datetime
import numpy as np
def business_days(x):
try:
return pd.DataFrame(np.busday_count(x['First Date'].tolist(), x['Last Date'].tolist())).shift().reset_index(drop=True)
except ValueError:
return None
df = pd.DataFrame(data=[['A', datetime(2016, 1, 7), None],
['A', datetime(2016, 3, 1), datetime(2016, 3, 8)],
['B', datetime(2016, 5, 1), datetime(2016, 5, 10)],
['B', datetime(2016, 6, 5), datetime(2016, 6, 7)]],
columns=['Letter', 'First Date', 'Last Date'])
df['First Date'] = df['First Date'].apply(lambda x: x.to_datetime().date())
df['Last Date'] = df['Last Date'].apply(lambda x: x.to_datetime().date())
df['Gap'] = df.groupby('Letter').apply(business_days)
print df
Saída real:
Letter First Date Last Date Gap
0 A 2016-01-07 NaT NaN
1 A 2016-03-01 2016-03-08 NaN
2 B 2016-05-01 2016-05-10 NaN
3 B 2016-06-05 2016-06-07 NaN
Saída desejada:
Letter First Day Last Day Gap
0 A 2016-01-07 NAT NAN
1 A 2016-03-01 2016-03-08 NAN
2 B 2016-05-01 2016-05-10 NAN
3 B 2016-06-05 2016-06-07 7