Объединение фреймов данных Pandas с неправильно выровненными индексами

#pandas #concatenation

#pandas #конкатенация

Вопрос:

У меня есть 3 фрейма данных, train и test которые содержат мои обучающие и тестовые наборы соответственно. svd_col содержит функции как для обучающего, так и для тестового набора, в таком порядке.

Размеры выстраиваются в линию:

 print(svd_col.shape)
print(train.shape)
print(test.shape)

#output:
(237774, 32) # 32 SVD components
(225609, 45)
(12165, 2) # 225609   12165 = 237774 as expected
  

Теперь я хочу объединить значения SVD со столбцами id и target моего набора данных и со id столбцом моего тестового набора.

Это работает так, как ожидалось для набора поездов:

 X_train = train[['id', 'target']]
print(X_train.shape)
print(svd_col[0:len(X_train)].shape)
X_train = pd.concat([X_train, svd_col[0:len(X_train)]], axis=1)
print('X_train', X_train.shape)

# output:
(225609, 2)
(225609, 32)
X_train (225609, 34) # perfect!
  

Теперь проблема! Я хочу сделать то же самое для тестового набора:

 X_test = test[['id']]
print(X_test.shape)
print(svd_col[len(X_train):].shape)
X_test = pd.concat([X_test, svd_col[len(X_train):]], axis=1)
print('X_test', X_test.shape)

# output:
(12165, 1)
(12165, 32)
X_test (24330, 33) # why 24330 and not 12165?!
  

Я думаю, проблема в том, что индекс svd_col не начинается с 0, поэтому я попытался сбросить его:

 X_test = X_test
X_test = pd.concat([X_test, svd_col[len(X_train):].reset_index()], axis=1)
print('X_test', X_test.shape)

# output:
(12165, 1)
(12165, 32)
X_test (12165, 34) # why 34 and not 33?
  

Но теперь у меня есть дополнительный столбец «индекс», который я не могу удалить :-/

Ответ №1:

Проблема заключается в том, что после reset_index создается новый столбец из индекса.

Вам нужен параметр drop=True , чтобы избежать этого:

 X_test = pd.concat([X_test, svd_col[len(X_train):].reset_index(drop=True)], axis=1)