2015-09-04 77 views
2

我在這裏有一個棘手的問題,關於將JSON字符串轉換爲Python數據字典用於分析Pandas。我已閱讀了其他一些問題,但沒有一個對我的案例起作用。將JSON轉換爲Python Dict與SQLAlchemy導入的Postgresql數據

以前,我只是簡單地使用CSV(和Pandas的read_csv函數)來執行我的分析,但現在我已經開始直接從PostgreSQL中提取數據。

我沒有問題,使用SQLAlchemy連接到我的引擎並運行我的查詢。我的整個腳本與我從CSV中獲取數據時的運行方式相同。也就是說,直到它轉到我試圖將其中一列(即下面的示例文本中的'config'列)從JSON轉換爲Python字典的部分。將其轉換爲字典的最終目標是能夠計算「config」列中「選項」字段下的響應數量。

df = pd.read_sql_query('SELECT questions.id, config from questions ', engine) 

df = df['config'].apply(json.loads) 

df = pd.DataFrame(df.tolist()) 

df['num_options'] = np.array([len(row) for row in df.options]) 

當我運行這個,我得到錯誤「TypeError:預期的字符串或緩衝區」。我嘗試將'config'列中的數據轉換爲來自對象的字符串,但這並沒有做到這一點(我得到了另一個錯誤,例如「ValueError:Expecting property name ...」)。

如果有幫助,這裏有一個在「配置」柱剪斷數據從一個細胞(代碼應返回的結果「6」這個剪斷,因爲有6個選項):

{"graph_by":"series","options":["Strongbow Case Card/Price Card","Strongbow Case Stacker","Strongbow Pole Topper","Strongbow Base wrap","Other Strongbow POS","None"]} 

我猜測是SQLAlchemy在將數據從數據庫中提取出來時會對JSON字符串做些奇怪的事情?當我只是從數據庫中提取CSV時不會發生什麼?

回答

0

在最近的Psycopg版本中,Postgresql json(b)適配Python是透明的。 Psycopg是默認的SQLAlchemy驅動PostgreSQL的

df = df['config']['options'] 

Psycopg手冊:

Psycopg can adapt Python objects to and from the PostgreSQL json and jsonb types. With PostgreSQL 9.2 and following versions adaptation is available out-of-the-box. To use JSON data with previous database versions (either with the 9.1 json extension, but even if you want to convert text fields to JSON) you can use the register_json() function.

+0

對不起,我在回覆您的延遲,但這種完美工作,非常感謝分享! –

0

只是sqlalchemy查詢:

q = session.query(
    Question.id, 
    func.jsonb_array_length(Question.config["options"]).label("len") 
) 

sql和熊貓read_sql_query

sql = """\ 
SELECT questions.id, 
     jsonb_array_length(questions.config -> 'options') as len 
FROM questions 
""" 
df = pd.read_sql_query(sql, engine) 

合併兩組(我的最愛):

# take `q` from the above 
df = pd.read_sql(q.statement, q.session.bind)