我有一个相当大的数据框,有超过100,000条记录。我需要在此数据帧的数字字段上重复执行范围搜索。我可以使用loc或查询执行此搜索,但这需要花费大量时间。我认为原因是现在它是一个强力搜索。是否有人在这个数字字段上生成索引,以便我可以在此字段上进行更好的优化范围搜索。
示例数据框 -
field1 field2 field3
red car 1000000000
green truck 2000000000
yellow bus 3000000000
white bike 4000000000
black cycle 5000000000
搜索 -
dataframe.query(field3 > 1000000000 & field3 < 5000000000)
我在for循环中使用此查询,该循环运行大约6000次。我的整体代码大约需要25分钟。从150毫秒起,将该片称为6000次将是900秒,即15分钟。如果我能以某种方式在这个领域创建一个索引,那么我认为查询时间会大大减少。
答案 0 :(得分:1)
一种方法是对数字列进行排序,然后使用searchsorted + iloc。 E.g。
df.iloc[df.field3.searchsorted(min_v, 'left'):df.field3.searchsorted(max_v, 'right')]
这似乎是我机器上df.query
的8倍,有10万条记录。
如果您提前知道了一组查询,则可以做得更好。例如,假设您有mins
数组maxs
和len(mins) == len(maxs) == 6000
min_ix = df.field3.searchsorted(mins, 'left')
max_ix = df.field3.searchsorted(maxs, 'right')
。您可以预先计算
for i, j in zip(min_ix, max_ix):
print(df.iloc[i:j])
通过
迭代过滤后的帧Code:
$fxml_response = $client->request('GET', 'AirportBoards', ['query' => $queryParams]);
try {
$body = json_decode($fxml_response->getBody(), true);
if ($fxml_response->getStatusCode() == 200 && !array_key_exists('error', $body)) {
foreach (['arrivals', 'departures', 'enroute', 'scheduled',] as $board) {
if($body['AirportBoardsResult'][$board]) {
$boardFlights = $body['AirportBoardsResult'][$board]['flights'];
$response[$board] = $boardFlights;
}
}
} else {
$response['error'] = $body['error'];
}
} catch (Exception $e) {
echo json_encode(['error' => 'Failed to retrieve Airport Board details.']);
}
// Send back the data
header('Content-Type: application/json');
echo json_encode($response);