Не удается изменить Pandas DataFrame во время итерации

1

Мой вопрос касается цикла 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 - почему это не работает?

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
Теги:
pandas
list
python-3.x
for-loop

2 ответа

1
Лучший ответ

Сортируйте его в цикле 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'].

  • 0
    Итак, похоже, это работает только на сериях, но не на данных. Например, это работает: for data in [train, test]: data['time'] = 5
  • 0
    jpp, я попробовал твои 3 предложенных решения. Только первый способ фактически сортирует данные в поезде. Другие 2 метода не делают.
Показать ещё 3 комментария
1

Существует простой способ: просто используйте параметр 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)
  • 1
    Верный. К сожалению, на месте это будет устаревшим. Источник: недавнее видео одного из главных разработчиков Pandas. Извините, я забыл ссылку и его имя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню