Не удается копирование столбца из одного dataframe в другой
Мне нужно скопировать в датасет с масштабированными данными ID пользователей. Или же можно как-то отмасштабировать, игнорируя столбец ID?
RFM_scaled = regular_RFM.copy()
RFM_scaled['Recency'] = RFM_scaled['Recency'].dt.days
RFM_scaled = StandartScaler().fit_transform(RFM_scaled.drop(columns='id'))
RFM_scaled = pd.DataFrame(RFM_scaled)
RFM_scaled.columns = ['Recency','Frequency','Monetary value']
RFM_scaled['id'] = regular_RFM['id'].copy()
RFM_scaled.head()
В выводе столбец id почему-то NaN
Ответы (1 шт):
Помимо уже отмеченных ошибок с StandartScaler вместо StandardScaler и days вместо day, основная проблема у вас в том, что вы делаете новый датафрейм и у него индексы сбрасываются, а при копировании Series индексы учитываются, поэтому когда вы копируете колонку id из одного датафрейма в другой у вас индексы не совпадают. Я так понимаю, что в regular_RFM индексы уже не с нуля и подряд, вы что-то с ним делали, поэтому в итоге такой эффект. Починить это можно, взяв в новый датафрейм индексы от старого. Это можно сделать несколькими способами, в частности можно указать индексы при создании нового датафрейма:
RFM_scaled = pd.DataFrame(RFM_scaled, index=regular_RFM.index)
^^^^^^^^^^^^^^^^^^^^^^^^^
Если кто-то ещё будет экспериментировать с этим вопросом, то вот код для генерации данных, воспроизводящих проблему:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
regular_RFM = pd.DataFrame(np.random.randint(0, 100, size=(100,4)),
columns = ['id', 'Recency','Frequency','Monetary value'],
index = range(1000, 1100))
regular_RFM['Recency'] = pd.date_range('2022-02-24', '2022-06-03')
P.S. Да, и постарайтесь избегать переиспользования одних и тех же переменных для разных сущностей, это очень запутывает. Да, это экономит память, но это запутывает того, кто читает код. У вас RFM_scaled - это и отмасштабированные данные и позже датафрейм с этими данными.