問題描述
在使用Django 的ORM model時,有時需要將數據導出並轉變成pandas DataFrame。正常的流程應該是:
import pandas as pd
from model import testeModel
data = testModel.objects.values()
# .values()返回的是[object1,object2]
df = pd.DataFrame(data)
但是系統一直會報錯,出錯信息如下:
Traceback (most recent call last)
/usr/local/lib/python3.4/dist-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy)
copy=False)
else:
raise ValueError('DataFrame constructor not properly called!')
ValueError: DataFrame constructor not properly called!
解決方案
雖然報的是值錯誤,很容易讓人以爲是data數據錯誤。
更隱晦的是即時數值格式都正確,還是會報上述錯誤,調試後發現這個ValueError錯誤指的是傳入的data數據的格式。一直以爲是list(例如[{‘name’:’hello’},{‘name’:’world’}]),畢竟print出來就是這個樣子,其實testModel.objects.values()返回的實際類型是:
<class 'django.db.models.query.ValuesQuerySet'>
而這個ValuesQuerySet也支持python的for…in…遍歷操作,這就是很容易遺漏的地方。知道後簡單的格式轉換就可以解決:
import pandas as pd
from model import testeModel
# success
data = testModel.objects.values()
df = pd.DataFrame(list(data))