2016-06-24 6 views
1

Я знаю, как присоединиться к таблицам различными способами в pandas - concat, merge и т. Д., Но я хотел бы знать, как это сделать, используя pandasql. В частности, я хотел бы присоединиться к двум кадрам данных pandas в индексе. Это возможно? Когда я делаюКак объединить два кадра данных pandas в pandasql с помощью индекса?

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

Я получаю правильный результат. (У меня есть «ключ» переменной на обеих таблицах.) Однако, когда я пытаюсь

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

Я получаю

--------------------------------------------------------------------------- 
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;'] 

ответ

0

Просто назовите индекс df1.index.rename('foo', inplace=True), то вы можете обратиться к индексу по колонке под названием 'foo' в запросе sql.

Это потому, что pandasql будет проверять, если имя индекса установлено:

От 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 

Примечание: Я попытался переименовать индекс «индекса» и запрос не удалось , Но это удалось с другим набором имен. Может быть, «index» - keyword in SQLite?

Или вы можете добавить новый столбец, который совпадает с индексом: df1['index'] = df1.index.