Ausgabe
Die Aufgabe im Folgenden. Es ist notwendig, die mittlere Zeit aller Verspätungen für jede Fluggesellschaft (Fluggesellschaft) zu ermitteln. Negative Werte sollten nicht verwendet werden.
Flugdatensatz:
Carrier ArrDelay DepDelay
Car1 10 14
Car1 -3 0
Car2 20 13
Car2 14 15
Car3 -3 -1
Car3 2 1
Car3 -10 -3
Lösung (mit den Händen):
Car1: (10 + 14) / 2 = 12
Car2: (20 + 13 + 14 + 15) / 2 = 31
Car3: (2 + 1) / 3 = 0.66
Das Ausgabeergebnis sollte sein:
Car2 31
Car1 12
Car3 0.66
Einer der Benutzer schlug diese gute Lösung vor (vielleicht sieht er sie):
out = (
df.mask(df.lt(0), 0)
.assign(AverageAllDelay= lambda x: x['ArrDelay'].add(x['DepDelay']))
.groupby('Carrier', as_index=False)['AverageAllDelay'].mean()
)
print(out)
Aber da ist der Fehler '<' not supported between instances of 'str' and 'int'
. Anfänglich ArrDelay
und DepDelay
haben das float64
Format aus der CSV-Datei. Ich habe diese Werte mit Hilfe zahlreicher Methoden aus anderen Stackoverflow-Themen in Integer konvertiert, aber nichts hat geholfen. Wie man es löst?
Datensatz (falls erforderlich, aber in der CSV-Datei werden alle Informationen zum Flug in einen String geschrieben):
data = {
'Carrier ': {0: '1', 1: '1', 2: '2', 3: '2', 4: '3', 5: '3', 6: '3'},
'ArrDelay': {0: 10, 1: -3, 2: 20, 3: 14, 4: -3, 5: 2, 6: -10},
'DepDelay': {0: 14, 1: 0, 2: 13, 3: 15, 4: -1, 5: 1, 6: -3}
}
Lösung
Der Fehler tritt auf, weil df.mask(df.lt(0), 0)
ein elementweiser Vergleich Ihres df
to durchgeführt wird 0
und die 'Carrier'
Spalte Ihres df Zeichenfolgen enthält.
Sie können es versuchen df['Carrier'] = df['Carrier'].astype(int)
und dann wird Ihr Code ohne Fehler ausgeführt:
>>> out = (
... df.mask(df.lt(0), 0)
... .assign(AverageAllDelay= lambda x: x['ArrDelay'].add(x['DepDelay']))
... .groupby('Carrier', as_index=False)['AverageAllDelay'].mean()
... )
>>> out
Carrier AverageAllDelay
0 1 12.0
1 2 31.0
2 3 1.0
Beantwortet von – Derek O
Antwort geprüft von – Candace Johnson (FixError Volunteer)