KeyError cuando se usa un filtro booleano en el dataframe de pandas

Intentar combinar dos marcos de datos cuando un objeto datetime de un dataframe está dentro de un rango de objetos datetime en el otro.

Sigue obteniendo: KeyError: ‘no se puede usar un solo bool para indexar en setitem’ en esta línea de código en la segunda parte que publiqué.

gametaxidf.loc[arrivemask, 'relevant'] = 1 

Supongo que también sucedería en la siguiente línea con un comando similar.

Esta es la parte que me da problemas:

 with open('/Users/benjaminprice/Desktop/TaxiCombined/Data/combinedtaxifiltered.csv', 'w') as csvfile: fieldnames1 = ['index','pickup_datetime', 'dropoff_datetime', 'pickup_long', 'pickup_lat','dropoff_long','dropoff_lat','passenger_count','trip_distance','fare_amount','tip_amount','total_amount','stadium_code'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames1) writer.writeheader() for index, row in baseballdf.iterrows(): gametimestart = row['Start.Time'] gametimeend = row['End.Time'] arrivemin = gametimestart - datetime.timedelta(minutes=120) arrivemax = gametimeend - datetime.timedelta(minutes = 30) departmin = gametimeend - datetime.timedelta(minutes = 60) departmax = gametimeend + datetime.timedelta(minutes = 90) gametaxidf = combineddf[combineddf.DATE==row.DATE] gametaxidf['relevant']=0 for index, row in gametaxidf.iterrows(): arrivemask = (arrivemin < row['dropoff_datetime']) and (row['dropoff_datetime'] < arrivemax) departmask = (departmin < row['pickup_datetime']) and (row['pickup_datetime'] < departmax) gametaxidf.loc[arrivemask, 'relevant'] = 1 gametaxidf.loc[departmask, 'relevant'] = 1 with open('/Users/benjaminprice/Desktop/TaxiCombined/Data/combinedtaxifiltered.csv','a') as combinedtaxi: gametaxidf.to_csv(combinedtaxi,header=None) print(str(index) + "done") 

Gametaxidf.head (5):

  index pickup_datetime dropoff_datetime pickup_long pickup_lat \ 0 195 2014-04-01 00:08:13 2014-04-01 00:15:32 -73.922218 40.827557 1 344 2014-04-01 00:16:30 2014-04-01 00:20:38 -73.846046 40.754566 2 558 2014-04-01 00:28:59 2014-04-01 00:36:36 -73.921692 40.831394 3 744 2014-04-01 00:42:00 2014-04-01 00:49:46 -73.938080 40.804646 4 776 2014-04-01 00:43:54 2014-04-01 00:53:22 -73.952652 40.810577 dropoff_long dropoff_lat passenger_count trip_distance fare_amount \ 0 -73.900620 40.856174 1 2.30 9.0 1 -73.890259 40.753246 1 0.56 4.5 2 -73.942719 40.823257 1 1.53 7.0 3 -73.928490 40.830433 1 2.96 11.0 4 -73.924332 40.827320 1 2.28 10.5 tip_amount total_amount stadium_code DATE relevant 0 0 10.0 1.1 2014-04-01 0 1 0 5.5 2.1 2014-04-01 0 2 0 8.0 1.1 2014-04-01 0 3 0 12.0 1.0 2014-04-01 0 4 0 11.5 1.0 2014-04-01 0 

También obteniendo esta advertencia: un valor está tratando de establecerse en una copia de un sector desde un DataFrame.

 Try using .loc[row_indexer,col_indexer] = value instead 

Pero me está permitiendo continuar con eso … cualquier ayuda sería genial.

aquí

 gametaxidf.loc[arrivemask, 'relevant'] = 1 

está intentando establecer valores de .loc de .loc mediante el operador .loc . Pandas docs para seleccionar filas dice:

.loc se basa principalmente en tags, pero también se puede utilizar con una matriz booleana. .loc generará KeyError cuando no se encuentren los elementos. Las entradas permitidas son:

  • Una sola etiqueta, por ejemplo, 5 o ‘a’, (tenga en cuenta que 5 se interpreta como una etiqueta del índice. Este uso no es una posición entera a lo largo del índice)
  • Una lista o conjunto de tags [‘a’, ‘b’, ‘c’]
  • Un objeto de rebanada con tags ‘a’: ‘f’, (tenga en cuenta que, a diferencia de las rebanadas de python habituales, ¡tanto el inicio como el final están incluidos!)
  • Una matriz booleana

Estás tratando de usar el último tipo de entrada, pero esto

 arrivemask = (arrivemin < row['dropoff_datetime']) and (row['dropoff_datetime'] < arrivemax) 

es escalar booleano, no matriz.

No necesitas iterar a través del dataframe. Pandas lo hace por ti. Solo usa:

 gametaxidf.loc[ (arrivemin < gametaxidf['dropoff_datetime']) & (gametaxidf['dropoff_datetime'] < arrivemax) , 'relevant'] = 1