2017-05-08 6 views
2

Ich habe eine einfache Oracle-Abfrage, um Daten durch paar Tabellen zu erhalten.pandas.read_sql Rückgabe von Serien Objekttyp anstelle von SQL-Typ

Abfrage:

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

diese Abfrage im pandas.read_sql Verfahren unter Verwendung von

pandas.read_sql(query,connection_object) 

In dem resultierenden Datenrahmen die Art des spalte1 und Col2 sind Serie anstelle von Oracle-Objekten oder dem äquivalenten Typ in Python .

Meine Frage ist, in welchem ​​Szenario pandas.read_sql() Serienobjekt anstelle des tatsächlichen Typs zurückgibt?

+0

Sie Die Frage ist nicht klar. Welchen Datentyp haben "a.col1" und "b.col2" in Oracle? – MaxU

+0

col1 ist eine Zahl und col2 ist varchar – abhi1489

+0

also was entspricht 'dtype' erwarten Sie in Pandas zu haben? – MaxU

Antwort

0

Ich kann es nicht reproduzieren:

Oracle:

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) 

Ergebnis:

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 

Moduls Versionen:

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:

jeder Datenrahmen Spalte ein Objekt von Pandas.Series Typ - es hat nichts mit den Spalten dtype zu tun:

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 

Wenn Sie ein dtype überprüfen mögen (analog zum Oracle-Spaltendatentyp) verwenden Sie DataFrame.dtypes Attribut:

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

Danke für die Mühe – abhi1489

+0

df.dtypes funktioniert wie erwartet und gibt den Datentyp, den ich erwartet habe. Wenn ich jedoch einen Typ (df [col1]), die zurückgibt eine Reihe – abhi1489

+0

@ abhi1489, natürlich tut es. Jede 'DataFrame'-Spalte ist ein Objekt von' Pandas.Series'. Ich habe meinen Beitrag aktualisiert - ich hoffe, es ist jetzt klarer ... – MaxU

Verwandte Themen