У меня есть фрейм данных со столбцом, содержащим вложенные 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 для моего вложенного случая.
Любые предложения о том, как это сделать бежать быстрее?