Python 在数据帧上使用布尔过滤器时出现KeyError
当一个数据帧中的日期时间对象在另一个数据帧中的日期时间对象范围内时,尝试合并两个数据帧 Keep getting:KeyError:“无法使用单个bool索引到我发布的第二个块中的这行代码的setitem”Python 在数据帧上使用布尔过滤器时出现KeyError,python,pandas,boolean,dataframe,keyerror,Python,Pandas,Boolean,Dataframe,Keyerror,当一个数据帧中的日期时间对象在另一个数据帧中的日期时间对象范围内时,尝试合并两个数据帧 Keep getting:KeyError:“无法使用单个bool索引到我发布的第二个块中的这行代码的setitem” gametaxidf.loc[arrivemask, 'relevant'] = 1 我假设它也会在下面的一行中使用类似的命令发生 这是给我带来麻烦的部分: with open('/Users/benjaminprice/Desktop/TaxiCombined/Data/combined
gametaxidf.loc[arrivemask, 'relevant'] = 1
我假设它也会在下面的一行中使用类似的命令发生
这是给我带来麻烦的部分:
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")
也得到了这个警告:一个值正试图从一个数据帧的切片副本上设置
Try using .loc[row_indexer,col_indexer] = value instead
但这让我可以继续下去。。。任何帮助都很好。这里
gametaxidf.loc[arrivemask, 'relevant'] = 1
您正试图通过.loc
运算符设置数据帧值。说:
.loc主要基于标签,但也可与布尔数组一起使用。当找不到项目时,loc将引发KeyError。允许的输入为:
- 单个标签,例如5或“A”(注意,5被解释为索引的标签。此用法不是索引上的整数位置)
- 标签的列表或数组['A'、'b'、'c']
- 标签为“A”:“f”的切片对象(注意,与通常的python切片不同,开始和停止都包括在内!)
- 布尔数组
arrivemask = (arrivemin < row['dropoff_datetime']) and
(row['dropoff_datetime'] < arrivemax)
arrivemask=(arrivemin|
是标量布尔值,而不是数组
您不需要遍历dataframe。熊猫帮你做。只需使用:
gametaxidf.loc[
(arrivemin < gametaxidf['dropoff_datetime'])
&
(gametaxidf['dropoff_datetime'] < arrivemax)
, 'relevant'] = 1
gametaxidf.loc[
(arrivemin
您还可以显示数据帧的头部吗?刚刚在上面添加了它们。。。baseballdf中有你感兴趣的特定列吗?想看看gametaxidf,那是导致问题的列,对吗?是的。。。刚意识到这就是你的意思。。。如上所述,您应该编辑您的问题并删除所有其他不相关的代码部分,包括您粘贴的原始df。你想用arrivemask和departmask做什么?
gametaxidf.loc[
(arrivemin < gametaxidf['dropoff_datetime'])
&
(gametaxidf['dropoff_datetime'] < arrivemax)
, 'relevant'] = 1