Behandlung von None-Werten bei Verwendung von Pandas Groupby und Apply with a Function
Ich habe einDataframe
imPandas
mit einem Buchstaben und zwei Datumsangaben als Spalten. Ich möchte die Werktage zwischen den beiden Datumsspalten für die vorherige Zeile mit @ berechneshift()
, vorausgesetzt dass dasLetter
Wert ist der gleiche (mit einem.groupby()
). Ich habe das mit @ gemac.apply()
. Dies hat funktioniert, bis ich einige Daten eingegeben habe, in denen eines der Daten fehlte. Ich habe alles in eine Funktion verschoben, um den fehlenden Wert mit einem @ zu behandeltry/except
-Klausel, aber jetzt gibt meine Funktion @ zurüNaN
für alles. Es erscheint dasNone
value for date wirkt sich auf jeden Aufruf der Funktion aus, wohingegen ich denke, dass es nur dann funktioniert, wenn dasLetter
von dem.groupby()
istA
.
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
Aktuelle Ausgabe:
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
Gewünschte Ausgabe:
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