熊猫默认情况下从字典列表中读取键作为值

时间:2019-05-29 16:10:31

标签: python pandas list dataframe dictionary

出于某些奇怪的原因,当提供适当的字典列表时,pandas DataFrame函数似乎无法正常工作。而不是将键读取为列名,而将值读取为实际行,而是将键名读取为每一行的值。

我已经使用.from_records和.from_dict尝试了几种变体,但没有任何结果

In [44]:

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 个答案:

答案 0 :(得分:2)

尝试使用

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 :(得分:0)

我认为您要执行的操作有些错误,DataFrame的构造函数不会将您想要的任何数组作为参数,它可以接收

  

ndarray(结构化或同类),可迭代,dict或DataFrame

因此,如果您想使用字典,这是使用它的正确方法:

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoOptimization | System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
private static void LoopThroughRows(DataGridView dgv) {
    DataGridViewRowCollection rows = dgv.Rows;
    for (int i = rows.Count - 1; i >= 0; i--) {
        DataGridViewRow row = rows[i];
    }
}

这是文档提供的示例。

我认为您应该先在字典中指定一列(例如'col1'),然后再指定包含值的数组,因此您的字典似乎格式不正确: 您的>>> d = {'col1': [1, 2], 'col2': [3, 4]} >>> df = pd.DataFrame(data=d) >>> df col1 col2 0 1 3 1 2 4 应该类似于:

result

或者您可以使用其他建议的不同功能!希望对您有帮助

答案 2 :(得分:0)

“假设是所有傻瓜的母亲”

我发现了问题。 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)

结果字典列表可以被熊猫正确识别,真棒!

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