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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage