2017-05-08 11 views
2

私は、テーブルのカップルを結合してデータを取得する簡単なOracleクエリを持っています。pandas.read_sqlは、SQL型の代わりにシリーズオブジェクト型を返します

クエリ:得られたデータフレームにpandas.read_sql方法でこのクエリを使用して

select a.col1,b.col2 
from table_a a,table_b b 
where key = 'some_key' and a.id = b.id 

pandas.read_sql(query,connection_object) 

はCOL1とCOL2のタイプはPythonで直列オブジェクトの代わりに、Oracleまたは同等のタイプであります。

私の質問はどのようなシナリオですか?pandas.read_sql()は、実際のタイプではなくシリーズオブジェクトを返しますか?

+0

質問は明確ではありません。どのデータ型がOracleでは 'a.col1'と' b.col2'を持っていますか? – MaxU

+0

col1は数値で、col2はvarchar – abhi1489

+0

です。したがって、対応する 'dtype'はあなたがPandasで期待するでしょうか? – MaxU

答えて

0

私はそれを再現することはできません。

オラクル:

create table tab1 (id number, col1 number); 
create table tab2 (id number, col2 varchar2(10)); 

insert into tab1 values(1, 10); 
insert into tab1 values(2, 11); 
insert into tab1 values(3,12); 

insert into tab2 values(1,'aaa'); 
insert into tab2 values(2,'bbb'); 
insert into tab2 values(3,'ccc'); 

commit; 

のPython:

import pandas as pd 
import cx_Oracle 
from sqlalchemy import types, create_engine 


usr = 'ora_user' 
pwd = 'ora_pwd' 
tns = """ 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = test-rac-scan.wirecard.sys)(PORT = 1521)) 
    (CONNECT_DATA = 
     (SERVER = DEDICATED) 
     (SERVICE_NAME = <MY_SERVICE_NAME>.wirecard) 
    ) 
) 
""" 

qry = """ 
select a.col1,b.col2 
from tab1 a, tab2 b 
where a.id = b.id 
""" 

engine = create_engine('oracle+cx_oracle://%s:%[email protected]%s' % (usr, pwd, tns))  
df = pd.read_sql(qry, engine) 

結果:

In [12]: df 
Out[12]: 
    col1 col2 
0 10 aaa 
1 11 bbb 
2 12 ccc 

In [13]: df.dtypes 
Out[13]: 
col1  int64  # <-------- NOTE ! 
col2 object 
dtype: object 

モジュールのバージョン:

In [14]: cx_Oracle.__version__ 
Out[14]: '5.3' 

In [15]: pd.__version__ 
Out[15]: '0.19.2' 

In [17]: sqlalchemy.__version__ 
Out[17]: '1.1.5' 

UPDATE:

各データフレームの列がPandas.Series型のオブジェクトである - それは、列のDTYPEとは何の関係もありません:あなたはdtypeを確認したい場合は

In [50]: type(df['col1']) 
Out[50]: pandas.core.series.Series 

In [51]: type(df['col2']) 
Out[51]: pandas.core.series.Series 

In [52]: type(df) 
Out[52]: pandas.core.frame.DataFrame 

を(OracleからOracle列のデータ型)を使用するとDataFrame.dtypes属性:

In [53]: df.dtypes 
Out[53]: 
col1 float64 
col2  object 
dtype: object 
+0

努力をありがとう – abhi1489

+0

df.dtypes期待どおりに動作し、私が期待していたデータ型を返します。私はタイプ(df [col1])シリーズ – abhi1489

+0

@ abhi1489もちろんです。各 'DataFrame'カラムは' Pandas.Series'のオブジェクトです。私は私のポストを更新しました - 私はそれが今より明確であることを願っています... – MaxU

関連する問題