Не удается изменить Pandas DataFrame во время итерации - PullRequest
0 голосов
/ 15 октября 2018

Мой вопрос о цикле FOR ниже, и я вижу, что его используют известные ученые-исследователи Kaggle.Однако, похоже, это не работает для меня.

Python 3.66.Панды 0.23.4

setup

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

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Существует простой способ, просто используйте параметр 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)
0 голосов
/ 15 октября 2018

Сортировка в цикле FOR - почему это не работает?

Поскольку ваш цикл for не привязывает вашу вновь определенную переменную data к объектам внутри вашего[train, test].Вы переопределяете data в каждом цикле без изменения train или test.

Вместо этого вы можете использовать распаковку последовательности:

train, test = (df.sort_values('time') for df in (train, test))

Или использовать enumerate вfor loop:

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'].

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