Limpieza de datos

Primero cargamos los dos archivos CSV que tenemos, correspondientes a los datos de los taxis amarillos y verdes. Podemos observar que dichos datasets no tienen las mismas dimensiones, teniendo el dataset de los taxis verdes más columnas.

In [1]:
#Importación de las librerias necesarias
import pandas as pd
from datetime import datetime
In [2]:
#Llamada al dataset con la información sobre los taxis verdes
filename = "green_monday.csv"
df_verdes = pd.read_csv(filename)
df_verdes.head()
Out[2]:
Unnamed: 0 VendorID lpep_pickup_datetime Lpep_dropoff_datetime Store_and_fwd_flag RateCodeID Pickup_longitude Pickup_latitude Dropoff_longitude Dropoff_latitude ... Ehail_fee improvement_surcharge Total_amount Payment_type Trip_type fecha dia_semana hora dia type
0 155624 2 2016-01-04 00:00:38 2016-01-04 00:02:30 N 1 -73.917793 40.770027 -73.911751 40.767914 ... NaN 0.3 4.8 2 1.0 2016-01-04 00:00:38 0 0 Monday Green
1 155625 2 2016-01-04 00:00:22 2016-01-04 00:04:45 N 1 -73.903465 40.744930 -73.897736 40.737614 ... NaN 0.3 6.3 2 1.0 2016-01-04 00:00:22 0 0 Monday Green
2 155626 2 2016-01-04 00:01:14 2016-01-04 00:04:29 N 1 -73.996758 40.658173 -74.007874 40.653667 ... NaN 0.3 6.3 2 1.0 2016-01-04 00:01:14 0 0 Monday Green
3 155627 2 2016-01-04 00:01:15 2016-01-04 00:05:40 N 1 -73.994125 40.703266 -73.996117 40.690907 ... NaN 0.3 6.8 2 1.0 2016-01-04 00:01:15 0 0 Monday Green
4 155628 2 2016-01-04 00:00:22 2016-01-04 00:04:45 N 1 -73.903465 40.744930 -73.897736 40.737614 ... NaN -0.3 -6.3 4 1.0 2016-01-04 00:00:22 0 0 Monday Green

5 rows × 27 columns

In [3]:
#Llamada al dataset con la información sobre los taxis amarillos
filename = "taxis_monday.csv"
df_amarillos = pd.read_csv(filename)
df_amarillos.head()
Out[3]:
Unnamed: 0 Unnamed: 0.1 VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance pickup_longitude pickup_latitude RatecodeID ... extra mta_tax tip_amount tolls_amount improvement_surcharge total_amount fecha dia_semana hora dia
0 11600 12680 2 2016-01-04 00:02:19 2016-01-04 00:23:11 1 16.37 -73.790016 40.646664 2 ... 0.0 0.5 17.50 5.54 0.3 75.84 2016-01-04 00:02:19 0 0 Monday
1 11700 12784 2 2016-01-04 00:02:22 2016-01-04 00:31:04 1 19.66 -73.782204 40.644642 1 ... 0.5 0.5 10.00 0.00 0.3 64.30 2016-01-04 00:02:22 0 0 Monday
2 11789 12875 2 2016-01-04 00:05:37 2016-01-04 00:26:02 3 4.07 -73.964691 40.803478 1 ... 0.5 0.5 0.00 0.00 0.3 18.30 2016-01-04 00:05:37 0 0 Monday
3 11867 12954 2 2016-01-04 00:05:37 2016-01-04 00:15:46 5 2.15 -74.003868 40.751381 1 ... 0.5 0.5 0.00 0.00 0.3 10.80 2016-01-04 00:05:37 0 0 Monday
4 24138 25600 2 2016-01-04 00:02:20 2016-01-05 00:00:00 2 20.40 -73.776726 40.645432 1 ... 0.5 0.5 10.96 0.00 0.3 65.76 2016-01-04 00:02:20 0 0 Monday

5 rows × 25 columns

Para cada uno de los datasets, vemos sus dimensiones y nombres de columna. Esto nos da información sobre qué columnas eliminar y cómo unificar los nombres de columna de ambos datasets

In [4]:
df_verdes.shape, df_verdes.columns.values
Out[4]:
((43582, 27), array(['Unnamed: 0', 'VendorID', 'lpep_pickup_datetime',
        'Lpep_dropoff_datetime', 'Store_and_fwd_flag', 'RateCodeID',
        'Pickup_longitude', 'Pickup_latitude', 'Dropoff_longitude',
        'Dropoff_latitude', 'Passenger_count', 'Trip_distance',
        'Fare_amount', 'Extra', 'MTA_tax', 'Tip_amount', 'Tolls_amount',
        'Ehail_fee', 'improvement_surcharge', 'Total_amount',
        'Payment_type', 'Trip_type ', 'fecha', 'dia_semana', 'hora', 'dia',
        'type'], dtype=object))
In [5]:
df_amarillos.shape, df_amarillos.columns.values
Out[5]:
((310141, 25),
 array(['Unnamed: 0', 'Unnamed: 0.1', 'VendorID', 'tpep_pickup_datetime',
        'tpep_dropoff_datetime', 'passenger_count', 'trip_distance',
        'pickup_longitude', 'pickup_latitude', 'RatecodeID',
        'store_and_fwd_flag', 'dropoff_longitude', 'dropoff_latitude',
        'payment_type', 'fare_amount', 'extra', 'mta_tax', 'tip_amount',
        'tolls_amount', 'improvement_surcharge', 'total_amount', 'fecha',
        'dia_semana', 'hora', 'dia'], dtype=object))

Eliminamos aquellas columnas únicas que solo están en uno de los dataset.

In [6]:
columns_drop_verdes = ['Ehail_fee', 'Trip_type ', 'type']
df_verdes.drop(columns_drop_verdes, inplace=True, axis=1)
df_amarillos.drop('Unnamed: 0.1', inplace=True, axis=1)

Creamos una nueva columna para ambos datasets. Esta establece la principal diferenciación entre ambos conjuntos de datos, su color.

In [7]:
df_verdes['color'] = "Verde"
df_amarillos['color'] = "Amarillo"

Concatenaremos las columnas comunes, renombrando las columnas del dataframe df_verdes con los mismos nombres que tiene el dataframe df_amarillos.

In [8]:
data = df_amarillos.merge(df_verdes.rename(columns={'lpep_pickup_datetime':'tpep_pickup_datetime',
                                            'Lpep_dropoff_datetime':'tpep_dropoff_datetime',
                                            'Passenger_count': 'passenger_count',
                                            'Trip_distance': 'trip_distance',
                                            'Pickup_longitude': 'pickup_longitude',
                                            'Pickup_latitude': 'pickup_latitude',
                                            'RateCodeID': 'RatecodeID',
                                            'Store_and_fwd_flag': 'store_and_fwd_flag',
                                            'Dropoff_longitude': 'dropoff_longitude',
                                            'Dropoff_latitude': 'dropoff_latitude',
                                            'Payment_type': 'payment_type',
                                            'Fare_amount': 'fare_amount',
                                            'Extra': 'extra',
                                            'MTA_tax': 'mta_tax',
                                            'Tip_amount': 'tip_amount',
                                            'Tolls_amount': 'tolls_amount',
                                            'Total_amount': 'total_amount',
                                            }),how='outer')
In [11]:
#Dataframe con los datos de ambos datasets
data.head()
Out[11]:
Unnamed: 0 VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag ... mta_tax tip_amount tolls_amount improvement_surcharge total_amount fecha dia_semana hora dia color
0 11600 2 2016-01-04 00:02:19 2016-01-04 00:23:11 1 16.37 -73.790016 40.646664 2 N ... 0.5 17.50 5.54 0.3 75.84 2016-01-04 00:02:19 0 0 Monday Amarillo
1 11700 2 2016-01-04 00:02:22 2016-01-04 00:31:04 1 19.66 -73.782204 40.644642 1 N ... 0.5 10.00 0.00 0.3 64.30 2016-01-04 00:02:22 0 0 Monday Amarillo
2 11789 2 2016-01-04 00:05:37 2016-01-04 00:26:02 3 4.07 -73.964691 40.803478 1 N ... 0.5 0.00 0.00 0.3 18.30 2016-01-04 00:05:37 0 0 Monday Amarillo
3 11867 2 2016-01-04 00:05:37 2016-01-04 00:15:46 5 2.15 -74.003868 40.751381 1 N ... 0.5 0.00 0.00 0.3 10.80 2016-01-04 00:05:37 0 0 Monday Amarillo
4 24138 2 2016-01-04 00:02:20 2016-01-05 00:00:00 2 20.40 -73.776726 40.645432 1 N ... 0.5 10.96 0.00 0.3 65.76 2016-01-04 00:02:20 0 0 Monday Amarillo

5 rows × 25 columns

In [12]:
#Comprobación de que la combinación ha sido efectiva
data.shape
Out[12]:
(353723, 25)
In [13]:
#Obtenemos infomación del dataframe creado
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 353723 entries, 0 to 353722
Data columns (total 25 columns):
Unnamed: 0               353723 non-null int64
VendorID                 353723 non-null int64
tpep_pickup_datetime     353723 non-null object
tpep_dropoff_datetime    353723 non-null object
passenger_count          353723 non-null int64
trip_distance            353723 non-null float64
pickup_longitude         353723 non-null float64
pickup_latitude          353723 non-null float64
RatecodeID               353723 non-null int64
store_and_fwd_flag       353723 non-null object
dropoff_longitude        353723 non-null float64
dropoff_latitude         353723 non-null float64
payment_type             353723 non-null int64
fare_amount              353723 non-null float64
extra                    353723 non-null float64
mta_tax                  353723 non-null float64
tip_amount               353723 non-null float64
tolls_amount             353723 non-null float64
improvement_surcharge    353723 non-null float64
total_amount             353723 non-null float64
fecha                    353723 non-null object
dia_semana               353723 non-null int64
hora                     353723 non-null int64
dia                      353723 non-null object
color                    353723 non-null object
dtypes: float64(12), int64(7), object(6)
memory usage: 70.2+ MB
In [14]:
#Más información sobre algunas variables del dataframe
data.describe()
Out[14]:
Unnamed: 0 VendorID passenger_count trip_distance pickup_longitude pickup_latitude RatecodeID dropoff_longitude dropoff_latitude payment_type fare_amount extra mta_tax tip_amount tolls_amount improvement_surcharge total_amount dia_semana hora
count 3.537230e+05 353723.000000 353723.000000 3.537230e+05 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.000000 353723.0 353723.000000
mean 1.221179e+06 1.561338 1.614749 2.737144e+01 -73.964643 40.751234 1.052140 -73.967807 40.752322 1.406875 12.092104 0.378354 0.496136 1.572404 0.319677 0.298588 15.157256 0.0 14.003458
std 5.150707e+05 0.496224 1.285082 1.349317e+04 0.147483 0.050832 0.503417 0.166731 0.053883 0.507811 11.781411 0.417853 0.046653 2.537310 2.240509 0.022722 14.296520 0.0 5.680558
min 1.160000e+04 1.000000 0.000000 0.000000e+00 -121.933289 33.230309 1.000000 -121.933289 33.021034 1.000000 -492.800000 -1.000000 -0.500000 -2.700000 0.000000 -0.300000 -492.800000 0.0 0.000000
25% 9.679455e+05 1.000000 1.000000 9.300000e-01 -73.989571 40.737549 1.000000 -73.988937 40.736115 1.000000 6.000000 0.000000 0.500000 0.000000 0.000000 0.300000 7.800000 0.0 9.000000
50% 1.056377e+06 2.000000 1.000000 1.600000e+00 -73.977089 40.756142 1.000000 -73.976357 40.756008 1.000000 8.500000 0.500000 0.500000 1.000000 0.000000 0.300000 10.560000 0.0 15.000000
75% 1.669508e+06 2.000000 2.000000 3.030000e+00 -73.957062 40.771255 1.000000 -73.956512 40.772572 2.000000 13.000000 1.000000 0.500000 2.050000 0.000000 0.300000 15.960000 0.0 19.000000
max 1.817535e+06 2.000000 9.000000 8.000010e+06 -71.584862 41.527466 99.000000 -71.584862 41.527466 4.000000 499.000000 7.000000 0.890000 300.000000 923.580000 0.300000 1003.380000 0.0 23.000000
In [15]:
#Comprobación de cuántas filas tienen valores negativos para total_amount
len(data[data["total_amount"]<0])
Out[15]:
206

La comprobación anterior ya nos pone en alerta de que tendremos que eliminar algunas variables con valores negativos donde no debería (cantidad total, coste, propina...) pero antes de hacer esto, hay algunos de los nombres de columna del dataframe no son demasiado entendibles por lo que los renombraremos.

In [16]:
data = data.rename(columns={'Unnamed: 0': 'ID',
                            'VendorID': 'vendorID',
                            'tpep_pickup_datetime': 'pickup_datetime',
                            'tpep_dropoff_datetime': 'dropoff_datetime',
                            'passenger_count': 'numero_pasajeros',
                            'trip_distance': 'distancia',
                            'RatecodeID': 'ratecodeID',
                            'payment_type': 'tipo_pago',
                            'fare_amount': 'coste',
                            'tip_amount': 'propina',
                            'tolls_amount': 'peaje',
                            'improvement_surcharge': 'recargo_mejora',
                            'total_amount': 'cantidad_total',
                            'hora': 'pickup_hora'
                           })

Comprobamos si hay algún valor faltante en todo el dataframe

In [17]:
data.isnull().sum().sum()
Out[17]:
0

Aquellas columnas con un único valor pueden ser eliminadas ya que no aportan ningún extra. Así, procedemos a identificarlas y eliminarlas.

In [18]:
#Identificación
for x in data.columns.values:
    if len(data[x].unique()) == 1:
        print(x)
dia_semana
dia
In [19]:
#Eliminación
columns_drop = ['dia_semana','dia']
data.drop(columns_drop, inplace=True, axis=1)

#Tambien eliminamos la columna fecha ya que es la misma que "pickup_datetime"
data.drop('fecha', inplace=True, axis=1)

Cálculo de la duración total de cada trayecto

Saber cuánto duró cada trayecto es un dato bastante importante por lo que procedemos a su cálculo tanto en minutos como en segundos.

In [20]:
#Extracción de la hora a partir de la fecha
pickup_hora = [pickup_time.split(" ")[1] for pickup_time in data["pickup_datetime"]]
dropoff_hora = [dropoff_time.split(" ")[1] for dropoff_time in data["dropoff_datetime"]]

#Agregamos las horas de pickup y dropoff como columnas nuevas del dataset
data['pickup_hora'] = pd.Series(pickup_hora, index=data.index)
data['dropoff_hora'] = pd.Series(dropoff_hora, index=data.index)

#Bucle para cálculo de la duracion
duracion_segundos=[]
duracion_minutos=[]
date_format = "%Y-%m-%d %H:%M:%S"
for index, fecha in enumerate(data["pickup_datetime"]):
    a = datetime.strptime(data["pickup_datetime"][index], date_format)
    b = datetime.strptime(data["dropoff_datetime"][index], date_format)
    c = b - a
    segundos = c.total_seconds()
    duracion_segundos.append(segundos)
    minutos = c.total_seconds()/60
    duracion_minutos.append(minutos)
    
data['duracion_segundos'] = pd.Series(duracion_segundos, index=data.index)
data['duracion'] = pd.Series(duracion_minutos, index=data.index)
data.head()
Out[20]:
ID vendorID pickup_datetime dropoff_datetime numero_pasajeros distancia pickup_longitude pickup_latitude ratecodeID store_and_fwd_flag ... mta_tax propina peaje recargo_mejora cantidad_total pickup_hora color dropoff_hora duracion_segundos duracion
0 11600 2 2016-01-04 00:02:19 2016-01-04 00:23:11 1 16.37 -73.790016 40.646664 2 N ... 0.5 17.50 5.54 0.3 75.84 00:02:19 Amarillo 00:23:11 1252.0 20.866667
1 11700 2 2016-01-04 00:02:22 2016-01-04 00:31:04 1 19.66 -73.782204 40.644642 1 N ... 0.5 10.00 0.00 0.3 64.30 00:02:22 Amarillo 00:31:04 1722.0 28.700000
2 11789 2 2016-01-04 00:05:37 2016-01-04 00:26:02 3 4.07 -73.964691 40.803478 1 N ... 0.5 0.00 0.00 0.3 18.30 00:05:37 Amarillo 00:26:02 1225.0 20.416667
3 11867 2 2016-01-04 00:05:37 2016-01-04 00:15:46 5 2.15 -74.003868 40.751381 1 N ... 0.5 0.00 0.00 0.3 10.80 00:05:37 Amarillo 00:15:46 609.0 10.150000
4 24138 2 2016-01-04 00:02:20 2016-01-05 00:00:00 2 20.40 -73.776726 40.645432 1 N ... 0.5 10.96 0.00 0.3 65.76 00:02:20 Amarillo 00:00:00 86260.0 1437.666667

5 rows × 25 columns

Cambio de las variables categóricas numéricas por sus valores descriptivos.

Estos pueden encontrarse en http://www.nyc.gov/html/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf. Según el pdf, las siguientes columnas deberán tener sólo los siguientes valores:

  • vendorID --> 1, 2
  • ratecodeID --> 1, 2, 3, 4, 5, 6
  • store_and_fwd_flag --> Y, N
  • tipo_pago --> 1, 2, 3, 4, 5, 6

Vamos a comprobar si esto es así.

In [21]:
#Comprobación de cuántos valores únicos tiene cada una de las variables anteriores
data["vendorID"].unique(), data["ratecodeID"].unique(), data['store_and_fwd_flag'].unique(), data['tipo_pago'].unique()
Out[21]:
(array([2, 1]),
 array([ 2,  1,  5,  4,  3, 99,  6]),
 array(['N', 'Y'], dtype=object),
 array([1, 2, 4, 3]))
In [22]:
data[data["ratecodeID"]==99]
Out[22]:
ID vendorID pickup_datetime dropoff_datetime numero_pasajeros distancia pickup_longitude pickup_latitude ratecodeID store_and_fwd_flag ... mta_tax propina peaje recargo_mejora cantidad_total pickup_hora color dropoff_hora duracion_segundos duracion
19806 942902 1 2016-01-04 07:43:02 2016-01-04 07:47:14 1 0.8 -73.987724 40.718548 99 Y ... 0.5 0.00 0.0 0.3 5.80 07:43:02 Amarillo 07:47:14 252.0 4.200000
133185 1056283 1 2016-01-04 21:40:52 2016-01-04 21:40:56 1 0.0 -73.938812 40.852512 99 N ... 0.0 0.00 0.0 0.3 0.30 21:40:52 Amarillo 21:40:56 4.0 0.066667
160925 1600184 2 2016-01-04 16:43:00 2016-01-04 16:43:00 1 0.0 -74.169769 40.758148 99 N ... 0.0 4.05 0.0 0.0 31.05 16:43:00 Amarillo 16:43:00 0.0 0.000000
161381 1600640 2 2016-01-04 16:46:00 2016-01-04 16:47:00 1 0.0 -74.169769 40.758148 99 N ... 0.0 0.00 0.0 0.0 35.00 16:46:00 Amarillo 16:47:00 60.0 1.000000
162940 1602199 2 2016-01-04 16:56:00 2016-01-04 16:57:00 1 0.0 -74.169769 40.758148 99 N ... 0.0 4.04 0.0 0.0 31.04 16:56:00 Amarillo 16:57:00 60.0 1.000000

5 rows × 25 columns

Algunos valores de la columna "ratecodeID" son valores numéricos diferentes a los que debería ser pero al ser tan poquitos, podemos sustituir estos valores por el valor 1 que corresponde a "Tarifa normal". También procedemos a cambiar todos los valores categóricos anteriores, ahora que sabemos con qué nombres descriptivos renombrarlos.

In [23]:
vendorID = ['Creative Mobile Technologies, LLC', 'VeriFone Inc']
ratecodeID = ['Tarifa normal', 'Aeropuerto JFK', 'Aeropuerto Newark', 'Aeropuerto Nassau or Westchester', 'Tarifa negociada', 'Viaje en grupo']
store_and_fwd_flag = ['store and forward trip', 'not a store and forward trip']
tipo_pago = ['Tarjeta', 'Efectivo', 'Sin cargos', 'Disputa', 'Desconocido', 'Viaje nulo']

data['vendorID'] = data['vendorID'].map({1: vendorID[0], 2: vendorID[1]})
data['ratecodeID'] = data['ratecodeID'].map({1: ratecodeID[0], 2: ratecodeID[1], 3: ratecodeID[2], 4: ratecodeID[3],
                                            5: ratecodeID[4], 6: ratecodeID[5], 99: ratecodeID[0]})
data['store_and_fwd_flag'] = data['store_and_fwd_flag'].map({'Y': store_and_fwd_flag[0], 'N': store_and_fwd_flag[1]})
data['tipo_pago'] = data['tipo_pago'].map({1: tipo_pago[0], 2: tipo_pago[1], 3: tipo_pago[2], 4: tipo_pago[3]})
In [24]:
#Comprobación
data["vendorID"].unique(), data["ratecodeID"].unique(), data['store_and_fwd_flag'].unique(), data['tipo_pago'].unique()
Out[24]:
(array(['VeriFone Inc', 'Creative Mobile Technologies, LLC'], dtype=object),
 array(['Aeropuerto JFK', 'Tarifa normal', 'Tarifa negociada',
        'Aeropuerto Nassau or Westchester', 'Aeropuerto Newark',
        'Viaje en grupo'], dtype=object),
 array(['not a store and forward trip', 'store and forward trip'],
       dtype=object),
 array(['Tarjeta', 'Efectivo', 'Disputa', 'Sin cargos'], dtype=object))

Eliminación de aquellos datos que no coinciden con nuestro planteamiento inicial o son outliers

Eliminamos todos aquellos datos con las siguientes características:

1) Pickups fuera del área de New York: Eliminamos todos aquellos datos con longitudes y latitudes fuera del área de New York ya que estamos haciendo el estudio justo dentro de esta ciudad.

2) Cuando el nº de pasajeros es 0.

3) Cuando el nº de pasajeros es mayor que 8 (máximo hay coches con 9 plazas: conductor + 8 pasajeros).

4) Trayectos donde la tarifa total, coste, propina o recargo por mejora sea <0.

5) Valores de extra y mta_tax diferentes a los que deberían de ser.

6) Trayectos donde la duración es > 300 (5 horas máximo conduciendo).

7) Trayectos donde la distancia recorrida sea > 600km (5h*120km/h).

Datos que NO eliminamos:

  • Dropoffs fuera del área de New York.
  • Dropoffs que se producen al día siguiente
In [25]:
data = data[data["numero_pasajeros"] > 0]
data = data[data["numero_pasajeros"] < 9]
data = data[data["coste"] >= 0]
data = data[data["propina"] >= 0]
data = data[data["cantidad_total"] >= 0]
data = data[data["duracion"] < 300]
data = data[data["distancia"] >= 0]
data = data[data["distancia"] < 600]
data = data[data["recargo_mejora"] >= 0]
values = [0,0.5,1]
data = data.loc[data["extra"].isin(values)]
values_mta = [0,0.5]
data = data.loc[data["mta_tax"].isin(values_mta)]

#Puntos dentro de la ciudad de New York
data = data[data["pickup_latitude"] > 40.55]
data = data[data["pickup_latitude"] < 40.93]
data = data[data["pickup_longitude"] < -73.10]
data = data[data["pickup_longitude"] > -74.20]
data = data.reset_index(drop=True)
data.head()
Out[25]:
ID vendorID pickup_datetime dropoff_datetime numero_pasajeros distancia pickup_longitude pickup_latitude ratecodeID store_and_fwd_flag ... mta_tax propina peaje recargo_mejora cantidad_total pickup_hora color dropoff_hora duracion_segundos duracion
0 11600 VeriFone Inc 2016-01-04 00:02:19 2016-01-04 00:23:11 1 16.37 -73.790016 40.646664 Aeropuerto JFK not a store and forward trip ... 0.5 17.5 5.54 0.3 75.84 00:02:19 Amarillo 00:23:11 1252.0 20.866667
1 11700 VeriFone Inc 2016-01-04 00:02:22 2016-01-04 00:31:04 1 19.66 -73.782204 40.644642 Tarifa normal not a store and forward trip ... 0.5 10.0 0.00 0.3 64.30 00:02:22 Amarillo 00:31:04 1722.0 28.700000
2 11789 VeriFone Inc 2016-01-04 00:05:37 2016-01-04 00:26:02 3 4.07 -73.964691 40.803478 Tarifa normal not a store and forward trip ... 0.5 0.0 0.00 0.3 18.30 00:05:37 Amarillo 00:26:02 1225.0 20.416667
3 11867 VeriFone Inc 2016-01-04 00:05:37 2016-01-04 00:15:46 5 2.15 -74.003868 40.751381 Tarifa normal not a store and forward trip ... 0.5 0.0 0.00 0.3 10.80 00:05:37 Amarillo 00:15:46 609.0 10.150000
4 26960 VeriFone Inc 2016-01-04 00:02:21 2016-01-04 00:17:48 1 3.96 -73.991997 40.754192 Tarifa normal not a store and forward trip ... 0.5 2.0 0.00 0.3 18.30 00:02:21 Amarillo 00:17:48 927.0 15.450000

5 rows × 25 columns

In [26]:
#Comprobación
data[data["cantidad_total"]<0]
Out[26]:
ID vendorID pickup_datetime dropoff_datetime numero_pasajeros distancia pickup_longitude pickup_latitude ratecodeID store_and_fwd_flag ... mta_tax propina peaje recargo_mejora cantidad_total pickup_hora color dropoff_hora duracion_segundos duracion

0 rows × 25 columns

In [27]:
#Columna extra para saber más facilmente si el taxista recibió propina
lista=[]
for index, datetime in enumerate(data["propina"]):
    if data["propina"][index]==0:
        lista.append("No")
    else:
        lista.append("Si")
data["propina?"]= pd.Series(lista, index=data.index)
data.head()
Out[27]:
ID vendorID pickup_datetime dropoff_datetime numero_pasajeros distancia pickup_longitude pickup_latitude ratecodeID store_and_fwd_flag ... propina peaje recargo_mejora cantidad_total pickup_hora color dropoff_hora duracion_segundos duracion propina?
0 11600 VeriFone Inc 2016-01-04 00:02:19 2016-01-04 00:23:11 1 16.37 -73.790016 40.646664 Aeropuerto JFK not a store and forward trip ... 17.5 5.54 0.3 75.84 00:02:19 Amarillo 00:23:11 1252.0 20.866667 Si
1 11700 VeriFone Inc 2016-01-04 00:02:22 2016-01-04 00:31:04 1 19.66 -73.782204 40.644642 Tarifa normal not a store and forward trip ... 10.0 0.00 0.3 64.30 00:02:22 Amarillo 00:31:04 1722.0 28.700000 Si
2 11789 VeriFone Inc 2016-01-04 00:05:37 2016-01-04 00:26:02 3 4.07 -73.964691 40.803478 Tarifa normal not a store and forward trip ... 0.0 0.00 0.3 18.30 00:05:37 Amarillo 00:26:02 1225.0 20.416667 No
3 11867 VeriFone Inc 2016-01-04 00:05:37 2016-01-04 00:15:46 5 2.15 -74.003868 40.751381 Tarifa normal not a store and forward trip ... 0.0 0.00 0.3 10.80 00:05:37 Amarillo 00:15:46 609.0 10.150000 No
4 26960 VeriFone Inc 2016-01-04 00:02:21 2016-01-04 00:17:48 1 3.96 -73.991997 40.754192 Tarifa normal not a store and forward trip ... 2.0 0.00 0.3 18.30 00:02:21 Amarillo 00:17:48 927.0 15.450000 Si

5 rows × 26 columns

Una vez terminada la limpieza, guardamos el dataframe limpio

In [28]:
data.to_csv("data_limpios.csv", sep=";", decimal=',', encoding='utf-8')