2016-02-05 63 views
9

我正在使用Python cassandra驅動程序來連接和查詢我們的Cassandra集羣。熊貓和卡桑德拉:numpy陣列格式不兼容

我想操縱通過熊貓我的數據,沒有爲卡桑德拉驅動程序的文檔中一個區域,說起這正是: https://datastax.github.io/python-driver/api/cassandra/protocol.html

NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with analysis toolkits such as Pandas.

按照上面的說明和卡桑德拉做一個SELECT查詢,我可以看到輸出(通過type()函數)爲:

<class 'cassandra.cluster.ResultSet'> 

通過迭代的結果,這是什麼打印行了爲來

{u'reversals_rejected': array([0, 0]), u'revenue': array([ 0, 10]), u'reversals_revenue': array([0, 0]), u'rejected': array([3, 1]), u'impressions_positive': array([3, 3]), u'site_user_id': array([226226, 354608], dtype=int32), u'error': array([0, 0]), u'impressions_negative': array([0, 0]), u'accepted': array([0, 2])} 

(我限制了查詢結果,我正在處理大量的數據 - 因此想要使用numpy和pandas)。

我的大熊貓的知識是有限的,我試圖運行非常基本的功能:

rslt = cassandraSession.execute("SELECT accepted FROM table") 

test = rslt[["accepted"]].head(1) 

它輸出以下錯誤:

Traceback (most recent call last): 
    File "/UserStats.py", line 27, in <module> 
    test = rslt[["accepted"]].head(1) 
    File "cassandra/cluster.py", line 3380, in cassandra.cluster.ResultSet.__getitem__ (cassandra/cluster.c:63998) 
TypeError: list indices must be integers, not list 

我理解錯誤,我只是不知道如何從這個假設的numpy數組「轉換」到能夠使用熊貓。

回答

7

簡短的回答是:

df = pd.DataFrame(rslt[0]) 
test = df.head(1) 

的rslt [0]爲您提供您的數據Python字典,可以很容易地轉換成數據幀大熊貓。

對於一個完整的解決方案:

import pandas as pd 
from cassandra.cluster import Cluster 
from cassandra.protocol import NumpyProtocolHandler 
from cassandra.query import tuple_factory 

cluster = Cluster(
    contact_points=['your_ip'], 
    ) 
session = cluster.connect('your_keyspace') 
session.row_factory = tuple_factory 
session.client_protocol_handler = NumpyProtocolHandler 

prepared_stmt = session.prepare ("SELECT * FROM ... WHERE ...;") 
bound_stmt = prepared_stmt.bind([...]) 
rslt = session.execute(bound_stmt) 
df = pd.DataFrame(rslt[0]) 

注:上述解決方案將只能得到你的數據的一部分,如果查詢較大。所以你應該這樣做:

df = pd.DataFrame() 
for r in rslt: 
    df = df.append(r) 
+0

感謝您的幫助!指定DataFrame的索引是我最後錯過的! – joao

+0

'.bind([...])'括號裏有什麼? – yeliabsalohcin

+1

@yeliabsalohcin這是你想發送給查詢的變量。因此,如果您在準備好的語句中有這樣的查詢:「SELECT * FROM users WHERE user_id =?AND date =?」他們會取代「?」。 – Tickon