читать большие файлы Excel с несколькими листами в JSON с Python - PullRequest
0 голосов
/ 09 ноября 2019

У меня большой файл Excel, и у меня есть несколько рабочих листов, его 100 МБ

лист A

id | name | address
1  | joe  |  A
2  | gis  |  B
3  | leo  |  C

work_1

id| call
1 | 10
1 | 8
2 | 1
3 | 3

work_2

id| call
2 | 4  
3 | 8
3 | 7

желаемый json для каждого идентификатора

data = { id: 1,
address: A,
name: Joe,
log : [{call:10}, {call:8 }]
}
data= { id: 2,
address: B,
name: Gis,
log : [{call:1}, {call:4}]
}
data= { id: 3,
address: C,
name: Leo,
log : [{call:3}, {call:8}, {call:7}]
}

Я пробовал с пандами, но для его запуска требуется 5 минут, и он только read_excel без какой-либо обработки. Есть ли решение, чтобы сделать это быстрее и как получить желаемый JSON?

может быть, разделить процесс на кусок (но pandas удалил chunksize для read_excel) и добавить некоторую многопоточность, чтобы сделать интервал, чтобы процессы могли печатать каждый пакет,

1 Ответ

0 голосов
/ 09 ноября 2019

Вы можете сделать:

works=pd.concat([work1,work2],ignore_index=True)
mapper_works=works.groupby('id')[['call']].apply(lambda x: x.to_dict('records'))
dfa['log']=dfa['id'].map(mapper_works)
data=dfa.reindex(columns=['id','address','name','log']).to_dict('records')
print(data)

Вывод представляет собой список dict для каждого id:

[{'id': 1, 'address': 'A', 'name': 'joe', 'log': [{'call': 10}, {'call': 8}]},
 {'id': 2, 'address': 'B', 'name': 'gis', 'log': [{'call': 1}, {'call': 4}]},
 {'id': 3, 'address': 'C', 'name': 'leo', 'log': [{'call': 3}, {'call': 8}, {'call': 7}]}
]

Если вы хотите, вы можете присвоить столбцу:

dfa['dicts']=data
print(dfa)

   id name address                                      log  \
0   1  joe       A              [{'call': 10}, {'call': 8}]   
1   2  gis       B               [{'call': 1}, {'call': 4}]   
2   3  leo       C  [{'call': 3}, {'call': 8}, {'call': 7}]   

                                               dicts  
0  {'id': 1, 'address': 'A', 'name': 'joe', 'log'...  
1  {'id': 2, 'address': 'B', 'name': 'gis', 'log'...  
2  {'id': 3, 'address': 'C', 'name': 'leo', 'log'...  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...