首页 > 解决方案 > Python suds通过soap请求导入pandas获取数据 - 定义列和行

问题描述

我正在使用 suds 从 wsdl 获取数据,并且已成功从相应服务获取数据。现在作为回应,我有以下数据,即“sudsobject”

(rowset){item[] = ](row){]item[] = (column){name = "client_hi"value = "01.129"},(column){name = "vendor_hi"value = "01.199"(column){name = "src_bill_time"value = "1521.37"},},(row){item[] = (column){name = "client_hi"value = "01.129"},(column){name = "vendor_hi"value = None},(column){name = "src_bill_time"value = None},},(row){item[] = (column){name = "client_hi"value = "01.129"},(column){name = "vendor_hi"value = "01.196"},(column){name = "src_bill_time"value = "898.88"},}

现在,我需要一个 Pandas 中的数据框,其中包含“名称”作为列,包含 3 个“行”,每个单元格内都有“值”的数据。

要求的输出:

client_hi,vendor_hi,src_bill_time
1.129,1.199,1521.37
1.129,None,None
1.129,1.196,898.88

另外,我可以将其转换为 json 序列化格式:

{'item': [{'name': 'client_hi', 'value': '01.129'}, {'name': 'vendor_hi', 'value': '01.199'}, {'name': 'src_bill_time', 'value': '1521.37'},]}

{'item': [{'name': 'client_hi', 'value': '01.129'}, {'name': 'vendor_hi', 'value': 'None'}, {'name': 'src_bill_time' , 'value': 'None'},]} {'item': [{'name': 'client_hi', 'value': '01.129'}, {'name': 'vendor_hi', 'value': ' 1.196'}, {'name': 'src_bill_time', 'value': '898.88'},]}

但是,我仍在寻找一种方法来创建一个数据表,该数据表要导入包含在“名称”作为列的熊猫中,包括 3 个“行”,每个单元格内都有“值”的数据。(如上面的“请求输出”)

标签: pythonpandassudssoapheader

解决方案


我找到了解决方案。我不得不将 suds 对象转换为 JS 序列号:

def recursive_asdict(d):
"""Convert Suds object into serializable format."""
out = {}
for k, v in asdict(d).items():
    if hasattr(v, '__keylist__'):
        out[k] = recursive_asdict(v)
    elif isinstance(v, list):
        out[k] = []
        for item in v:
            if hasattr(item, '__keylist__'):
                out[k].append(recursive_asdict(item))
            elif not isinstance(item, list):
                out[k] = item
            else:
                out[k].append(item)
    else:
        out[k] = v
return out

并给出了问题中提到的格式: {'item': [{'name'... 之后,使用正则表达式,转换为 python 列表,删除一些字符和“值”和“名称”,这给了我以下格式:

[{'client_hi':  '01.129','vendor_hi':  '01.199' ,src_bill_time',  '1521.37',}]

最后使用熊猫

import pandas
df=pd.DataFrame(my_customized_list)

推荐阅读