pandas数据帧优化查询

时间:2018-06-06 16:17:04

标签: python pandas dataframe

我有一个相当大的数据框,有超过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分钟。如果我能以某种方式在这个领域创建一个索引,那么我认为查询时间会大大减少。

1 个答案:

答案 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数组maxslen(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);