Мой вопрос касается цикла FOR ниже, и это то, что я вижу, используется известными учеными-учеными в области Kaggle. Однако, похоже, это не работает для меня.
Python 3.66. Пандас 0.23.4
train = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
test = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
train
>>> id time
>>> 0 2 2017-04-17 22:23:22
>>> 1 3 2018-05-22 14:20:00
>>> 2 1 2017-01-09 08:02:14
train.sort_values('time', ascending=True)
>>> id time
>>> 2 1 2017-01-09 08:02:14
>>> 0 2 2017-04-17 22:23:22
>>> 1 3 2018-05-22 14:20:00
for data in [train, test]:
data = data.sort_values('time', ascending=True)
train
>>> id time
>>> 0 2 2017-04-17 22:23:22
>>> 1 3 2018-05-22 14:20:00
>>> 2 1 2017-01-09 08:02:14
Сортируйте его в цикле FOR - почему это не работает?
Поскольку цикл for
не связывает ваши новые data
переменной с объектами в вашем [train, test]
. Вы переопределяете data
в каждом цикле без изменения train
или test
.
Вместо этого вы можете использовать распаковку последовательностей:
train, test = (df.sort_values('time') for df in (train, test))
Или, используйте enumerate
в цикле for
:
data = [train, test]
for idx, df in enumerate(data):
data[idx] = df.sort_values('time')
Затем обратитесь к вашим данным по индексу, то есть к data[0]
, data[1]
.
Или, используйте словарь и итерации элементов:
d = {'train': train, 'test': test}
for key, df in d.items():
d[key] = df.sort_values('time')
Затем обращайтесь к своим файлам данных через ключ, то есть data['train']
, data['test']
.
Существует простой способ: просто используйте параметр inplace = True для сортировки
>>> train = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
>>> test = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
>>> for data in [train, test]:
data.sort_values('time', ascending=True, inplace=True)
>>> test
id time
2 1 2017-01-09 08:02:14
0 2 2017-04-17 22:23:22
1 3 2018-05-22 14:20:00
>>> train
id time
2 1 2017-01-09 08:02:14
0 2 2017-04-17 22:23:22
1 3 2018-05-22 14:20:00
Если вы хотите обновить индекс, просто добавьте reset_indext()
data.sort_values('time', ascending=True, inplace=True)
data.reset_index(inplace=True, drop=True)
for data in [train, test]: data['time'] = 5