2016-06-24 4 views
1

Ich weiß, wie man Tabellen in Pandas auf verschiedene Arten verbindet - concat, merge, etc. aber ich würde gerne wissen, wie man das auch mit Pandasql macht. Insbesondere möchte ich zwei Pandas Datenrahmen auf dem Index verbinden. Ist das möglich? Wenn ich macheWie verbinde ich zwei Pandas Datenrahmen in Pandasql mit dem Index?

new_df = pysqldf("SELECT a.*, b.list3 from df1 as a INNER JOIN df2 as b ON a.key=b.key;") 

Ich bekomme das richtige Ergebnis. (Ich habe einen „Schlüssel“ Variable auf beiden Tabellen.) Aber wenn ich versuche,

new_df = pysqldf("SELECT a.*, b.list3 from df1 as a INNER JOIN df2 as b ON a.index=b.index;") 

ich

--------------------------------------------------------------------------- 
PandaSQLException       Traceback (most recent call last) 
<ipython-input-154-ecab230d4dc9> in <module>() 
----> 1 new_df = pysqldf("SELECT a.*, b.list3 from df1 as a INNER JOIN df2 as b ON a.index=b.index;") 

<ipython-input-100-adc122e97ed8> in <lambda>(q) 
     1 from pandasql import sqldf 
----> 2 pysqldf = lambda q: sqldf(q, globals()) 

/Users/jwesley/anaconda/lib/python2.7/site-packages/pandasql/sqldf.pyc in sqldf(query, env, db_uri) 
    154  >>> sqldf("select avg(x) from df;", locals()) 
    155  """ 
--> 156  return PandaSQL(db_uri)(query, env) 

/Users/jwesley/anaconda/lib/python2.7/site-packages/pandasql/sqldf.pyc in __call__(self, query, env) 
    61     result = read_sql(query, conn) 
    62    except DatabaseError as ex: 
---> 63     raise PandaSQLException(ex) 
    64    except ResourceClosedError: 
    65     # query returns nothing 

PandaSQLException: (sqlite3.OperationalError) near "index": syntax error [SQL: 'SELECT a.*, b.list3 from df1 as a INNER JOIN df2 as b ON a.index=b.index;'] 

Antwort

0

Nennen Sie den Index df1.index.rename('foo', inplace=True) dann können Sie auf den Index durch Spalte verweisen genannt 'foo' in der SQL-Abfrage.

Das weil pandasql ist überprüft, ob der Indexname festgelegt ist:

Von https://github.com/yhat/pandasql/blob/a6b7ac405ef741400221600d6769faaf1bdbc6ab/pandasql/sqldf.py#L121

def write_table(df, tablename, conn): 
    """ Write a dataframe to the database. """ 
    with catch_warnings(): 
     filterwarnings('ignore', 
         message='The provided table name \'%s\' is not found exactly as such in the database' % tablename) 
     to_sql(df, name=tablename, con=conn, 
       index=not any(name is None for name in df.index.names)) # load index into db if all levels are named 

Hinweis: Ich habe versucht, den Index 'Index' und die Abfrage fehlgeschlagen Umbenennung . Aber es ist mit anderen Indexnamen erfolgreich. Vielleicht 'Index' ist ein keyword in SQLite?

Oder Sie können eine neue Spalte hinzufügen, die mit dem Index übereinstimmt: df1['index'] = df1.index.

Verwandte Themen