1

連結、マージなど、パンダでさまざまな方法でテーブルを結合する方法を知っていますが、pandasql を使用してこれを行う方法も知りたいです。具体的には、インデックスで 2 つの 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;")

私は得る

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

1 に答える 1

0

インデックスに名前を付けるだけで、SQL クエリでdf1.index.rename('foo', inplace=True)指定された列でインデックスを参照できます。'foo'

これは、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' に変更しようとしましたが、クエリは失敗しました。しかし、他のインデックス名セットで成功しました。多分「インデックス」はSQLiteのキーワードですか?

または、インデックスと同じ新しい列を追加できます: df1['index'] = df1.index.

于 2016-09-16T21:04:44.810 に答える