Как оптимизировать код для итерации по dict и хранения значений в списках? - PullRequest
1 голос
/ 29 октября 2019

У меня есть этот словарь

example = {

'view_id_ga_standard_111': {'view_id': '111',
  'request_type': 'ga_standard',
  'start_date': '2019-07-01',
  'end_date': '2019-09-01',
  'status': 'New'},

'view_id_ga_standard_333': {'view_id': '333',
  'request_type': 'ga_standard',
  'start_date': '2019-07-01',
  'end_date': '2019-09-01',
  'status': 'New'},

'view_id_ga_corporate_222': {'view_id': '222',
  'request_type': 'ga_corporate',
  'start_date': '2018-07-01',
  'end_date': '2018-09-01',
  'status': 'New'}
}


И мне нужно сделать из него pandas df, чтобы он выглядел следующим образом

    id  request_type start_date  end_date   request_id  status

2   111 ga_standard  2019-07-01 2019-09-01  1           New
3   333 ga_standard  2019-07-01 2019-09-01  2           New
5   222 ga_corporate 2018-07-01 2018-09-01  3           New

Я закончил с этой функцией

def ga_make_request_types(params):
    vids = []
    rtypes = []
    sdates = []
    edates = []
    js = []
    statuses = []
    j = 0


    for k,v in data_for_config.items():
        j = j + 1
        view_id = v['view_id']
        vids.append(view_id)
        request_type = v['request_type']
        rtypes.append(request_type)
        start_date = v['start_date']
        sdates.append(start_date)
        end_date = v['end_date']
        edates.append(end_date)
        status = v['status']
        statuses.append(status)
        js.append(j)

    df = pd.DataFrame(zip(vids, rtypes, sdates, edates, js, statuses), columns=['id', 'request_type', 'start_date', 'end_date', 'request_id', 'status'])

    return df

Но это довольно уродливо, возможно ли сократить код с помощью списочных представлений?

Я пробовал вот так

for k,v in data_for_config.items():
   vids = [v['view_id'] for v in k]

и вот так

for k,v in data_for_config.items():
   vids = [v['view_id'] for v in data_for_config[k]]

Но выдает ошибку

TypeError: string indices must be integers

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Загрузите dict и Transpose DataFrame

pd.DataFrame(example).T.reset_index(drop=True).rename(columns={'view_id':'id'})

    id  request_type  start_date    end_date status
0  111   ga_standard  2019-07-01  2019-09-01    New
1  333   ga_standard  2019-07-01  2019-09-01    New
2  222  ga_corporate  2018-07-01  2018-09-01    New
2 голосов
/ 29 октября 2019

Как насчет:

df = pd.DataFrame(example).T

Вывод:

                            end_date  request_type  start_date status view_id
view_id_ga_corporate_222  2018-09-01  ga_corporate  2018-07-01    New     222
view_id_ga_standard_111   2019-09-01   ga_standard  2019-07-01    New     111
view_id_ga_standard_333   2019-09-01   ga_standard  2019-07-01    New     333

Редактировать:

Я не уверен, как определяется request_id, но вы могли бы сделатьчто-то вроде:

df['request_id'] = range(1, df.shape[0] + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...