Python Can';t在迭代时修改数据帧
我的问题是关于下面的FOR循环,我看到Kaggle上的著名数据科学家正在使用它。然而,它似乎不适合我 Python 3.66。 熊猫0.23.4 设置 排序(这个有效) 在FOR循环中进行排序-为什么这不起作用? 在FOR循环中进行排序-为什么这不起作用 因为您的Python Can';t在迭代时修改数据帧,python,python-3.x,pandas,list,for-loop,Python,Python 3.x,Pandas,List,For Loop,我的问题是关于下面的FOR循环,我看到Kaggle上的著名数据科学家正在使用它。然而,它似乎不适合我 Python 3.66。 熊猫0.23.4 设置 排序(这个有效) 在FOR循环中进行排序-为什么这不起作用? 在FOR循环中进行排序-为什么这不起作用 因为您的for循环没有将新定义的变量数据绑定到[训练,测试]中的对象。您正在每个循环内重新定义数据,而不更改列车或测试 相反,您可以使用序列解包: train, test = (df.sort_values('time') for df in
for
循环没有将新定义的变量数据
绑定到[训练,测试]
中的对象。您正在每个循环内重新定义数据
,而不更改列车
或测试
相反,您可以使用序列解包:
train, test = (df.sort_values('time') for df in (train, test))
或者,在for
循环中使用枚举
:
data = [train, test]
for idx, df in enumerate(data):
data[idx] = df.sort_values('time')
然后通过索引引用数据帧,即数据[0]
,数据[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()
好吧,看来这只适用于系列,但不适用于数据帧。例如,这是有效的:
对于[train,test]中的数据:data['time']=5
jpp,我尝试了你提出的3种解决方案。实际上,只有第一种方法对序列中的数据进行排序。其他两种方法不行。@ihopethiswillfi,你必须了解如何使用第二种和第三种解决方案。在第一种情况下,将数据帧称为data[0]/data[1]
,在第二种情况下,将数据帧称为data['train']/data['test']
。哦,这是有道理的。谢谢你知道为什么更新这个系列是有效的,但是更新数据帧却不行吗?或者我也可以创建一个新问题。@ihopethiswillfi,对不起,不确定“更新系列”是什么意思。正确。不幸的是,inplace将被弃用。资料来源:熊猫主要开发者之一的最新视频。对不起,我忘了链接和他的名字。
data = [train, test]
for idx, df in enumerate(data):
data[idx] = df.sort_values('time')
d = {'train': train, 'test': test}
for key, df in d.items():
d[key] = df.sort_values('time')
>>> 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
data.sort_values('time', ascending=True, inplace=True)
data.reset_index(inplace=True, drop=True)