Ускорение извлечения данных из вложенных JSON, содержащихся в столбце DataFrame - PullRequest
0 голосов
/ 05 августа 2020

У меня есть фрейм данных со столбцом, содержащим вложенные JSON данные

_p_final_fromPICKLE['label'].iloc[2]
'{"params": [{"X": 1500}, {"Y": 0.087}, {"Z": 0}, {"T": 0}]}'

Я хотел бы заполнить новые столбцы, которые содержат непосредственно данные (X, Y, Z и T в данном случае).

Лучшее, что я мог придумать на данный момент, это

     _p_final_fromPICKLE['Z']=_p_final_fromPICKLE['label'].apply(lambda x: utils.merge_dicts(*json.loads(x)["params"])['Z'] )

где

def merge_dicts(*dict_args):
    """
    Given any number of dicts, shallow copy and merge into a new dict,
    precedence goes to key value pairs in latter dicts.
    """
    result = {}
    for dictionary in dict_args:
        result.update(dictionary)
    return result

Создание столбца Z занимает 90 секунд для обработки 13 миллионов строк. На мой взгляд, это слишком медленно, потому что я могу выполнять простые операции между столбцами за доли секунды. Я думаю, что функция, которую я определил, не является основной причиной, потому что просто поворот столбца в JSON занимает 78 секунд

_p_final_fromPICKLE['params']=_p_final_fromPICKLE['label'].apply(lambda x:  json.loads(x)["params"]  )

Так что мне было интересно, не делаю ли я это каким-то образом неэффективным. Я не вижу возможности использовать json.loads, потому что у меня есть строка JSON в label, и мне нужно преобразовать ее в словарь, чтобы использовать данные. Этот json.loads кажется медленным. Может быть, из-за того, как я это называю. Я вижу людей здесь использует assign вместо apply, но мне не удалось найти простой вызов, который использует apply для моего вложенного случая.

Любые предложения о том, как это сделать бежать быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...