Как извлечь список из словарного значения и добавить к нему новые строки? - PullRequest
0 голосов
/ 11 января 2019

Как вынуть список из значения словаря и сделать его частью словаря?

Вот входные данные, с которыми мне дано работать:

[{'id': 1, 'step_and_result': [{'step': 'stepA', 'result': 'resultA'}, {'step': 'stepB', 'result': 'resultB'}, {'step': 'stepC', 'result': 'ResultC'}], 'other_key2': random_text}]

Вот вывод, который я пытаюсь получить:

[{'id': 1, 'step': 'stepA' + '\n' + 'stepB' + '\n' + 'stepC', 'result': 'resultA' + '\n' + 'resultB' + '\n' + 'resultC', 'other_key2': random_text}]

так что, когда я помещаю словарь в фрейм данных, шаги и результаты отображаются в разных строках, но в одной и той же ячейке

enter image description here

В основном я застрял на том, как шаг и результат задаются в словаре в списке в словаре в списке. Спасибо за вашу помощь.

Ответы [ 4 ]

0 голосов
/ 11 января 2019

Я использовал функцию, чтобы ключ мог быть либо «ожидаемым», либо «результатом».

import pandas as pd
l=[{'id': 1,
    'step_and_result': [{'step': 'stepA', 'result': 'resultA'}, {'step': 'stepB', 'expected': 'resultB'}, {'step': 'stepC', 'expected': 'ResultC'}],
    'other_key2': 'random_text'}]
needed_l=l[0]['step_and_result']
def result_or_expected(d):
    if 'expected' in d.keys():
        return d['expected']
    return d['result']
new_dict_list={x['step']:result_or_expected(x) for x in needed_l}
df=pd.DataFrame(list(new_dict_list.items()), columns=['Step', 'Result'])
print(df.to_string(index=False))

выход

Step   Result
stepA  resultA
stepB  resultB
stepC  ResultC
0 голосов
/ 11 января 2019

1-й, я думаю, вы должны убедиться, что все объекты имеют одинаковый ключ результата в step_and_result. В вашем исходном примере результат stepA отображается в поле «result», но в b и c он отображается как «Ожидается». можно ли сохранить их все с помощью клавиши «результат»?

Если это так, вот быстрый готовый ответ:

# this will be your converted end-result
converted = []

# we're going to iterator over each object and convert step objects into strings
for obj in original:
  # extract the step_and_result object 
  step_objs = obj['step_and_result']

  # we're going to store objects in list, and later we will join the list by our new-line delimeter once we're received all the results and steps
  results = []
  steps = []
  for s in step_objs:
    step, result = s['step'], s['result']
    steps.append(step)
    results.append(result)

  # add them to the end result my converting the lists into strings
  converted.append({
    'id': obj['id'],
    'step': '\n'.join(steps),
    'result': '\n'.join(results),
    'other_key2': obj['other_key2']
  })
0 голосов
/ 11 января 2019

Если все ваши ключи внутри step_and_result имеют имя result (не также expected), и если вам все равно, что происходит с other_key2, вот решение с использованием json_normalize :

raw = [{'id': 1,
        'other_key2': 'asdf',
        'step_and_result': [{'result': 'resultA', 'step': 'stepA'},
                            {'result': 'resultB', 'step': 'stepB'},
                            {'result': 'ResultC', 'step': 'stepC'}]}]

from pandas.io.json import json_normalize
json_normalize(raw, record_path='step_and_result').sort_index(axis=1, ascending=False)

    step   result
0  stepA  resultA
1  stepB  resultB
2  stepC  ResultC
0 голосов
/ 11 января 2019

Как сказал Питер Леймбиглер, странно, как ключ результата становится ожидаемым. Предполагая, что вы сохраняете то же имя, вот решение с использованием списочных представлений:

    # changed first 'result' key to 'expected'
    given_input = [{'id': 1, 'step_and_result': [{'step': 'stepA', 'expected': 'resultA'}, {'step': 'stepB', 'expected': 'resultB'}, {'step': 'stepC', 'expected': 'ResultC'}], 'other_key2': random_text}]

    given_input[0]['step'] = '\n'.join([d['step'] for d in given_input[0]['step_and_result']])
    given_input[0]['result'] = '\n'.join([d['expected'] for d in given_input[0]['step_and_result']])
    given_input[0].pop('step_and_result')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...