2016-06-24 8 views
1

나는 pandas - concat, merge 등 다양한 방법으로 테이블을 조인하는 방법을 알고 있지만 pandasql을 사용하여 이것을 수행하는 방법을 알고 싶습니다. 특히, 나는 인덱스에 두 개의 판다 데이터 프레임을 합류하고 싶습니다. 이것이 가능한가? 내가 할 때인덱스를 사용하여 pandasql에서 두 개의 pandas 데이터 프레임을 결합하는 방법은 무엇입니까?

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;") 

시도 난 그냥 df1.index.rename('foo', inplace=True)은 다음 'foo'라는 이름의 열을 기준으로 인덱스를 참조 할 수 있습니다 인덱스의 이름을

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

을 얻을 때 SQL 쿼리에서.

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 

https://github.com/yhat/pandasql/blob/a6b7ac405ef741400221600d6769faaf1bdbc6ab/pandasql/sqldf.py#L121에서 : 나는 '인덱스'실패한 쿼리에 인덱스의 이름을 변경하려고했습니다 pandasql 인덱스 이름이 설정되어 있는지 확인하기 때문입니다

. 그러나 다른 인덱스 이름 집합과 함께 성공했습니다. '색인'은 keyword in SQLite일까요?

또는 인덱스와 동일한 새 열을 추가 할 수 있습니다 (df1['index'] = df1.index).