панды читают ключи как значения из списка словарей по умолчанию - PullRequest
0 голосов
/ 29 мая 2019

По какой-то странной причине функция DataFrame pands не работает должным образом при предоставлении ей правильного списка словарей.Вместо того, чтобы читать ключ как имя столбца и значения как фактические строки, он считывает имена ключей как значения для каждой строки.

Я уже пробовал несколько вариантов, используя .from_records и .from_dict без какого-либо результата.Полный код:

In [44]:
from zeep import Client
import pandas as pd
client = Client('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl')

results = []
requests = [['IE', '6390845P'],['NL', '6390845P']]

for x in requests:
    results.append(client.service.checkVat(x[0],x[1]))

results

Out[44]:
[{
     'countryCode': 'IE',
     'vatNumber': '6390845P',
     'requestDate': datetime.date(2019, 5, 29),
     'valid': True,
     'name': 'BLACKNIGHT INTERNET SOLUTIONS LTD',
     'address': 'UNIT 12A, BARROWSIDE BUSINESS PARK, SLEATY ROAD, GRAIGUECULLEN CARLOW'
 }, {
     'countryCode': 'NL',
     'vatNumber': '6390845P',
     'requestDate': datetime.date(2019, 5, 29),
     'valid': False,
     'name': '---',
     'address': '---'
 }]

In [68]:

df = pd.DataFrame(results)
df
​

В результате

+---+-------------+-----------+-------------+-------+------+---------+
|   | 0           | 1         | 2           | 3     | 4    | 5       |
+---+-------------+-----------+-------------+-------+------+---------+
| 0 | countryCode | vatNumber | requestDate | valid | name | address |
+---+-------------+-----------+-------------+-------+------+---------+
| 1 | countryCode | vatNumber | requestDate | valid | name | address |
+---+-------------+-----------+-------------+-------+------+---------+

Должен быть

+---+-------------+-----------+-------------+-------+------+---------+
|   | countryCode | vatNumber | requestDate | valid | name | address |
+---+-------------+-----------+-------------+-------+------+---------+
| 0 | IE          | 6390845P  | 2019/5/29   | true  | etc. | etc.    |
+---+-------------+-----------+-------------+-------+------+---------+
| 1 | NL          | 6390845P  | 2019/5/29   | false | ---  | ---     |
+---+-------------+-----------+-------------+-------+------+---------+

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

Попробуйте использовать

df = pd.DataFrame.from_records(results)

Это должно правильно отформатировать кадр данных.Я использую панды версии 0.24.1.

                                             address countryCode  \
0  UNIT 12A, BARROWSIDE BUSINESS PARK, SLEATY ROA...          IE   
1                                                ---          NL   

                                name requestDate  valid vatNumber  
0  BLACKNIGHT INTERNET SOLUTIONS LTD  2019-05-29   True  6390845P  
1                                ---  2019-05-29  False  6390845P
1 голос
/ 29 мая 2019

Я думаю, что то, что вы пытаетесь сделать, немного неправильно, конструктор DataFrame не принимает в качестве аргумента какой бы массив вы ни хотели, он может получить

ndarray (структурированный или однородный), Iterable, dict или DataFrame

Поэтому, если вы хотите использовать словарь, это правильный способ его использования:

>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> df
   col1  col2
0     1     3
1     2     4

Это пример, предоставленный doc.

Я думаю, что вы должны указать в своем словаре сначала столбец (например, 'col1'), а затем массив, содержащий значения, так что ваш словарь не выглядит правильно: ваш result должен выглядеть примерно так:

{
'countryCode' : ['IE','NL'], 
'vatNumber':[6390845P,6390845P], 
'requestDate': [datetime.date(2019, 5, 29),datetime.date(2019, 5, 29)], 
'valid':[True, False], 
'name': ['BLACKNIGHT INTERNET SOLUTIONS LTD', '---'], 
'address': ['UNIT 12A, BARROWSIDE BUSINESS PARK, SLEATY ROAD, GRAIGUECULLEN CARLOW', '---']
}

Или вы можете использовать различные функции, как предлагали другие!Я надеюсь, что это поможет

0 голосов
/ 03 июня 2019

«Предположение, что мать всех придурков»

Я нашел проблему.Модуль zeep не возвращает собственный тип данных Python, где я предполагал, что он возвращает стандартный словарь.

type(results[0])

Out[46]:
zeep.objects.checkVatResponse

Модуль имеет встроенную вспомогательную функцию для преобразования в словарь.

for x in requests:
    alpha = zeep.helpers.serialize_object(client.service.checkVat(x[0],x[1]))
    results.append(alpha)

Полученный список словарей правильно распознан Pandas, потрясающе!

Спасибо за помощь и предложения!Вы поставили меня на правильный путь и дали мне еще один ценный урок Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...