迭代时无法修改Pandas DataFrame

时间:2018-10-15 11:31:55

标签: python python-3.x pandas list for-loop

我的问题是有关下面的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

2 个答案:

答案 0 :(得分:1)

  

在FOR循环中将其排序-为什么这不起作用?

因为您的for循环未将新定义的变量data绑定到[train, test]中的对象。您将在每个循环中重新定义data,而无需更改traintest

相反,您可以使用序列拆包:

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']来引用您的数据框。

答案 1 :(得分: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)