2017-05-08 221 views
2

我有一个简单的oracle查询来通过连接几个表来检索数据。pandas.read_sql返回系列对象类型而不是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方法

pandas.read_sql(query,connection_object) 

使用该查询在所得的数据帧col1和COL2的类型是一系列对象,而不是Oracle或在python等效类型。

我的问题是在什么情况下pandas.read_sql()返回系列对象,而不是实际的类型?

+0

你问题不清楚。哪些数据类型在Oracle中具有'a.col1'和'b.col2'? – MaxU

+0

col1是一个数字,col2是varchar – abhi1489

+0

那么你会在Pandas中看到相应的'dtype'? – 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类型的对象 - 它没有任何与此列的D型:

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 

如果你想检查dtype (类似于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