Конвертировать мультизаголовок CSV во вложенный словарь в Python - PullRequest
0 голосов
/ 04 октября 2018

Содержимое моего CSV-файла: ::

[user@localhost ~]$ cat tempcsv.csv
info,info,auth,req,req
name,desc,username,key1,key2
a,alphabet,admin,1,team

Здесь CSV содержит два заголовка.

При использовании панд для чтения CSV,

>>> import pandas as pd
>>> pd.read_csv('tempcsv.csv', sep=',', header=[0,1], encoding = "utf-8-sig", skipinitialspace=True, tupleize_cols=True)
  (info, name) (info, desc) (auth, username)  (req, key1) (req, key2)
0            a     alphabet            admin            1        team
>>> df = pd.read_csv('tempcsv.csv', sep=',', header=[0,1], encoding = "utf-8-sig", skipinitialspace=True, tupleize_cols=True)
>>> df.to_dict()
{(u'req', u'key1'): {0: 1}, (u'req', u'key2'): {0: u'team'}, (u'info', u'name'): {0: u'a'}, (u'auth', u'username'): {0: u'admin'}, (u'info', u'desc'): {0: u'alphabet'}}

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

>>> df.to_dict('records')
[{(u'req', u'key1'): 1, (u'req', u'key2'): u'team', (u'info', u'name'): u'a', (u'auth', u'username'): u'admin', (u'info', u'desc'): u'alphabet'}]

Когда я пытаюсь конвертировать их в правильный словарь,

>>> result = []
>>> row_data = {}
>>> for row in df.to_dict('records'):
...     for key,value in row.iteritems():
...             row_data.setdefault(key[0], {})[key[1]] = value
...
>>> row_data
{u'info': {u'name': u'a', u'desc': u'alphabet'}, u'req': {u'key2': u'team', u'key1': 1}, u'auth': {u'username': u'admin'}}

И это мой ожидаемый результат -

{u'info': {u'name': u'a', u'desc': u'alphabet'}, u'req': {u'key2': u'team', u'key1': 1}, u'auth': {u'username': u'admin'}}

Так что мой вопрос, есть ли способ преобразовать фрейм данных в диктовку с использованием Python?

Или есть способ сделатьто же самое, используя пакет csv?

Версия Pandas:

>>> import pandas as pd
pd>>> pd.__version__
'0.14.1'

1 Ответ

0 голосов
/ 04 октября 2018

Я не думаю, что pandas способен анализировать такие CSV, но вы всегда можете использовать встроенный модуль csv и анализировать данные самостоятельно, например:

import csv
import collections

with open("tempcsv.csv", "rb") as f: # on Python 3.x use: open("tempcsv.csv", "r", newline="")
    reader = csv.reader(f)  # create a CSV reader
    header = next(reader)  # collect the primary header
    subheader = next(reader)  # collect the subheader
    rows = []
    for row in reader:  # iterate over the rest of the CSV file
        parsed_row = collections.defaultdict(dict)  # use a dictionary factory
        for i, v in enumerate(header):  # iterate over the primary header fields
            # update each in the factory using the primary->secondary header map
            parsed_row[v].update({subheader[i]: row[i]})  
        rows.append(parsed_row)

.создайте список rows, содержащий все строки с заголовками fused .Для ваших данных строка будет выглядеть так:

{'info': {'name': 'a', 'desc': 'alphabet'},
 'auth': {'username': 'admin'},
 'req': {'key1': '1', 'key2': 'team'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...