2016-02-05 7 views
9

私はPythonの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クエリを実行し、 Iとして出力(タイプビア()関数)を参照することができる:

:結果を反復

<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 

私はエラーを理解し、私は知りませんPandasを使うことができるようにするために、この想定されていない配列からどのように「移行するか」。

答えて

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

関連する問題