[英]Convert python nested JSON-like data to dataframe
我的記錄如下所示,我需要將其寫入一個csv文件中:
my_data={"data":[{"id":"xyz","type":"book","attributes":{"doc_type":"article","action":"cut"}}]}
看起來像json,但下一條記錄以"data"
而不是"data1"
開頭,這迫使我分別讀取每條記錄。 然后,我使用eval()
將其轉換為dict,以迭代鍵和值的某個路徑以獲取所需的值。 然后,我根據需要的鍵生成鍵和值的列表。 然后, pd.dataframe()
將該列表轉換為我知道如何轉換為csv的數據pd.dataframe()
。 我的有效代碼如下。 但我相信,有更好的方法可以做到這一點。 地雷的伸縮性很差。 謝謝。
counter=1
k=[]
v=[]
res=[]
m=0
for line in f2:
jline=eval(line)
counter +=1
for items in jline:
k.append(jline[u'data'][0].keys())
v.append(jline[u'data'][0].values())
print 'keys are:', k
i=0
j=0
while i <3 :
while j <3:
if k[i][j]==u'id':
res.append(v[i][j])
j += 1
i += 1
#res is my result set
del k[:]
del v[:]
將my_data更改為:
my_data = [{"id":"xyz","type":"book","attributes":{"doc_type":"article","action":"cut"}}, # Data One
{"id":"xyz2","type":"book","attributes":{"doc_type":"article","action":"cut"}}, # Data Two
{"id":"xyz3","type":"book","attributes":{"doc_type":"article","action":"cut"}}] # Data Three
您可以這樣將其直接轉儲到數據幀中:
mydf = pd.DataFrame(my_data)
尚不清楚您的數據路徑是什么,但是如果您要查找id
, type
等的特定組合,則可以顯式搜索
def find_my_way(data, pattern):
# pattern = {'id':'someid', 'type':'sometype'...}
res = []
for row in data:
if row.get('id') == pattern.get('id'):
res.append(row)
return row
mydf = pd.DataFrame(find_my_way(mydata, pattern))
編輯:
在不討論api的工作原理的情況下,您將需要執行以下偽代碼:
my_objects = []
calls = 0
while calls < maximum:
my_data = call_the_api(params)
data = my_data.get('data')
if not data:
calls+=1
continue
# Api calls to single objects usually return a dictionary, to group objects they return lists. This handles both cases
if isinstance(data, list):
my_objects = [*data, *my_objects]
elif isinstance(data, {}):
my_objects = [{**data}, *my_objects]
# This will unpack the data response into a list that you can then load into a DataFrame with the attributes from the api as the columns
df = pd.DataFrame(my_objects)
假設您從api獲得的數據如下所示:
"""
{
"links": {},
"meta": {},
"data": {
"type": "FactivaOrganizationsProfile",
"id": "Goog",
"attributes": {
"key_executives": {
"source_provider": [
{
"code": "FACSET",
"descriptor": "FactSet Research Systems Inc.",
"primary": true
}
]
}
},
"relationships": {
"people": {
"data": {
"type": "people",
"id": "39961704"
}
}
}
},
"included": {}
}
"""
根據文檔,這就是為什么我使用my_data.get('data')
。
那應該使您所有的數據(未經過濾)進入DataFrame
將DataFrame
保存為最后一點對內存更友好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.