Объединение таблиц в пандах read_sql_query () - многоиндексная проблема - PullRequest
0 голосов
/ 25 апреля 2019

Я хотел бы создать DataFrame для панд, используя pandas.read_sql_query(), соединив две таблицы. Это мой код:

import pandas as pd
connection = ...
query = 'SELECT T0.*, T1.* FROM %s T0 LEFT JOIN %s T1 ON T0.NUMPERSO = T1.NUMPERSO' % (TABLE, TABLE_VARS)
raw_train_data = pd.read_sql_query(query, connection, index_col='numperso')

Приведенный выше код создает df raw_train_data, но затем raw_train_data.index возвращает:

Float64Index([[35477725.0, nan], [56756339.0, nan], [16596475.0, nan],
          [15921969.0, nan], [21866760.0, nan], [24199683.0, nan],
          [17290497.0, nan], [12785913.0, nan], [37230860.0, nan],
          [19049184.0, nan],
          ...
          [11332158.0, nan], [19624233.0, nan], [18763121.0, nan],
          [27757040.0, nan], [14169924.0, nan], [15978910.0, nan],
          [39321116.0, nan], [27472225.0, nan], [33970568.0, nan],
          [14526836.0, nan]],
         dtype='float64', name='numperso', length=289907)

Я думаю, что проблема в том, что index_col='numperso' существует в обеих таблицах, но установка index_col='t0.numperso' дает ошибку, и я хочу использовать только один 'numperso' в качестве индекса.

Можно ли указать, чтобы при импорте таблиц в качестве индекса использовался только один столбец?

EDIT : Я понимаю, что проблема в том, что столбец «NUMPERSO» принадлежит обеим таблицам. В общем случае столбцы с одинаковыми именами в обеих таблицах не удаляются на шаге pd.read_sql_query(). Я не указывал индекс, удалял дублирующиеся столбцы (с тем же именем, например 'NUMPERSO') и устанавливал индекс вручную:

raw_train_data = pd.read_sql_query(query, connection)
raw_train_data = raw_train_data.loc[:,~raw_train_data.columns.duplicated()]
train_data.set_index('numperso', inplace=True)

1 Ответ

0 голосов
/ 25 апреля 2019

Я не могу комментировать, что делает SQL-запрос, но вы можете просто исправить свой индекс в пандах.Попробуйте следующее:

idx = pd.DataFrame(raw_train_data.index.values.tolist(), columns=["rtd_idx", "nan"]).set_index(
    "rtd_idx"
).index

Я надеюсь, что это даст вам новый индекс, а затем вы можете просто установить свой dataframe.index = idx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...