2016-08-03 13 views
1

Ich versuche, eine Spalte in Pandas basierend auf einer bedingten Anweisung zu erstellen, die die Zeit zwischen zwei Ereignissen berechnet. Ich konnte den Tag Berechnung arbeiten, aber wenn sie in meine bedingte Anweisung gesteckt:Pandas Date Bedingte Berechnung

def defect_age(df): 
    if df['Status'] == 'R': 
     return (pd.to_datetime(df['resolved_on'], errors='coerce') - pd.to_datetime(df['submitted_on']))/np.timedelta64(1, 'D') 
    else: 
     return 'null' 

und später von der Säule genannt:

group_df['Age'] = group_df.apply(defect_age(group_df), axis=0) 

Ich erhalte die folgende Fehlermeldung:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Ich habe versucht, mir auf die gestellte Frage HERE Basis zu gründen ... Aber ich habe nicht viel Erfolg. Jede Hilfe wird geschätzt!

Antwort

1

Versuchen Sie, diese Definition mit der defect_age

def defect_age(df): 
    resolved = pd.to_datetime(df.resolved_on, errors='coerce') 
    submitted = pd.to_datetime(df.submitted_on) 
    r = (resolved - submitted)/np.timedelta64(1, 'D') 
    return np.where(df.Status == 'R', r, np.nan) 

Der Fehler herkam if df['Status'] == 'R'

Dies wäre eine Reihe von booleschen Werten und nicht ein einzelner boolescher Wert, den if benötigt. Du willst das immer noch über die ganze Serie laufen lassen. Ich hoffe, ich habe dir etwas gegeben, das den Trick macht.

+0

Fantastisch! Vielen Dank. Ihre Antwort ist genau das, was ich herausfinden wollte. Ich habe eine Menge mehr Status, die ich jetzt hinzufügen werde :) – anshanno

1

Machen Sie es wie folgt aus:

group_df['Age'] = group_df.apply(lambda row:defect_age(row), axis=1) 

Dies liegt daran, die Funktion zu jeder Zeile nicht auf die gesamte Datenrahmen auf einmal anwenden möchten.

df['Status'] == 'R' wird eine Liste von booleans geben, wenn auf einem Datenrahmen angewendet und u cant eine Liste von booleans in ein setzen, wenn Ausdruck

Verwandte Themen