[英]Converting a suds object into a dataframe with Pandas
我有一個看起來像這樣的列表:
`[(deliveryObject){
id = "0bf003ee0000000000000000000002a11cb6"
start = 2019-01-02 09:30:00
messageId = "68027b94b892396ed29581cde9ad07ff"
status = "sent"
type = "normal"
}, (deliveryObject){
id = "0bf0BE3ABFFDF8744952893782139E82793B"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113404"
status = "sent"
type = "transactional"
}, (deliveryObject){
id = "0bf0702D03CB42D848CBB0B0AF023A87FA65"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113403"
status = "sent"
type = "transactional"
}
]`
當我調用type()
Python告訴我這是一個列表。
當我使用pd.DataFrame(df)
將其轉換為數據pd.DataFrame(df)
,結果如下所示:
有人能幫我一下嗎? 該數據框應該具有列名,例如“ Id”,“ Start”,“ messageId”等,但它們只是作為每個觀察值的第一個元素出現,而列名則顯示為0、1、2等。
任何幫助表示贊賞,謝謝!
好的,這看起來不漂亮,但可以。 我將您的列表轉換為字符串:
import re
import pandas as pd
x = """[(deliveryObject){
id = "0bf003ee0000000000000000000002a11cb6"
start = 2019-01-02 09:30:00
messageId = "68027b94b892396ed29581cde9ad07ff"
status = "sent"
type = "normal"
}, (deliveryObject){
id = "0bf0BE3ABFFDF8744952893782139E82793B"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113404"
status = "sent"
type = "transactional"
}, (deliveryObject){
id = "0bf0702D03CB42D848CBB0B0AF023A87FA65"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113403"
status = "sent"
type = "transactional"
}
]"""
然后,我使用正則表達式以某種方式列出字典:
a = re.sub(' =', ':', x)
a = re.sub('\(deliveryObject\)', '', a)
for x in ['id', 'start', 'messageId', 'status', 'type']:
a = re.sub(x, '\''+x+'\'', a)
a = re.sub("(?<=[\"0])\n(?= +?[\'])", '\n,', a)
a = re.sub('(?<=[0])\n(?=,)', '\"\n', a)
a = re.sub('(?<=[:]) (?=[0-9])', ' \"', a)
a = re.sub('(?<= )\"(?=[\w])', '[\"', a)
a = re.sub('(?<=[\w])\"(?=\n)', '\"]', a)
現在,您有了字典列表。 第一排看起來像這樣
list_of_dict = eval(a)
df = pd.DataFrame(list_of_dict[0])
print(df.head())
id start messageId status type
0 0bf003ee0000000000000000000002a11cb6 2019-01-02 09:30:00 68027b94b892396ed29581cde9ad07ff sent normal
從list_of_dict添加其余的字典。
請隨意改善我的正則表達式,我知道它看起來很糟糕。
如果這是針對bronto的,並且正在使用SOAP和suds實現。 然后,deliveryObject只是一個suds對象。
你可以做
from suds.client import Client
list_of_deliveryObjects = [(deliveryObject){
id = "0bf003ee0000000000000000000002a11cb6"
start = 2019-01-02 09:30:00
messageId = "68027b94b892396ed29581cde9ad07ff"
status = "sent"
type = "normal"
}, (deliveryObject){
id = "0bf0BE3ABFFDF8744952893782139E82793B"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113404"
status = "sent"
type = "transactional"
}, (deliveryObject){
id = "0bf0702D03CB42D848CBB0B0AF023A87FA65"
start = 2018-12-29 23:00:00
messageId = "0bc403eb0000000000000000000000113403"
status = "sent"
type = "transactional"
}
]
data = [Client.dict(suds_object) for suds_object in list_of_deliveryObjects]
df = pd.DataFrame(data)
我這樣做:
import pandas as pd
lst =[{
'id':"0bf003ee0000000000000000000002a11cb6",
'start' : "2019-01-02 09:30:00",
'messageId': "68027b94b892396ed29581cde9ad07ff",
'status' : "sent",
'type' : "normal"
},{
'id' : "0bf0BE3ABFFDF8744952893782139E82793B",
'start' : "2018-12-29 23:00:00",
'messageId' : "0bc403eb0000000000000000000000113404",
'status' : "sent",
'type' : "transactional"
}, {
'id' : "0bf0702D03CB42D848CBB0B0AF023A87FA65",
'start' : "2018-12-29 23:00:00",
'messageId' : "0bc403eb0000000000000000000000113403",
'status' : "sent",
'type' : "transactional"
}]
df = pd.DataFrame(lst)
df
並得到了這個(也參見附件圖片):
id messageId start status type
0 0bf003ee0000000000000000000002a11cb6 68027b94b892396ed29581cde9ad07ff 2019-01-02 09:30:00 sent normal
1 0bf0BE3ABFFDF8744952893782139E82793B 0bc403eb0000000000000000000000113404 2018-12-29 23:00:00 sent transactional
2 0bf0702D03CB42D848CBB0B0AF023A87FA65 0bc403eb0000000000000000000000113403 2018-12-29 23:00:00 sent transactional
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.