Python 默认情况下,从字典列表中将键作为值读取

Python 默认情况下,从字典列表中将键作为值读取,python,pandas,list,dataframe,dictionary,Python,Pandas,List,Dataframe,Dictionary,出于某种奇怪的原因,熊猫数据帧函数在提供适当的字典列表时似乎并没有按预期工作。它不是将键读取为列名,将值读取为实际行,而是将键名称读取为每行的值 我已经尝试了使用.from_记录和.from_dict的几种变体,但没有任何结果。完整代码: In [44]: from zeep import Client import pandas as pd client = Client('http://ec.europa.eu/taxation_customs/vies/checkVatService.ws

出于某种奇怪的原因,熊猫数据帧函数在提供适当的字典列表时似乎并没有按预期工作。它不是将键读取为列名,将值读取为实际行,而是将键名称读取为每行的值

我已经尝试了使用.from_记录和.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 | ---  | ---     |
+---+-------------+-----------+-------------+-------+------+---------+

我认为您试图做的有点错误,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”),然后指定一个包含值的数组,这样您的字典似乎格式不正确: 您的
结果应类似于:

{
'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', '---']
}
或者你可以像其他人建议的那样使用不同的功能!我希望这有帮助

“假设是所有混蛋之母”

我发现了问题。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)
该模块有一个内置的助手函数,可以将其转换为字典

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)
由此产生的词典列表得到了熊猫的正确认可,真棒


感谢所有的帮助和建议!您让我走上了正确的道路,给我上了另一堂有价值的Python课。

您可以转置生成的数据帧。你想要的输出是什么?当我把dict传递给dataframe函数时,我得到了想要的输出。我无法重现你的问题。您运行的pandas、python和操作系统的版本是什么?这似乎是与早期函数的特定输出有关的问题。当我复制结果的输出并用它构造另一个变量时,pandas似乎能正确地解释它。版本:Python3.6.3 jupyter 5.0.0 pandas 0.24.2结果变量的完整代码:
code from zeep import Client import pandas as pd Client=Client('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl')结果=[]请求=[['IE',6390845P',['NL',6390845P']]对于请求中的x:results.append(client.service.checkVat(x[0],x[1])结果