我正在用熊猫处理一个非常大的数据集,使之成为更易于管理的数据框架。我有一个循环,它根据前导ID号将数据帧分割成更小的数据帧,然后根据date列进行排序。然而,我注意到,在所有的运行之后,仍然存在一些日期不能正确排序的问题。我希望创建一个手动筛选器,它基本上遍历date列并检查下一个日期是否大于或等于上一个日期。理想情况下,这将消除日期列可能出现的问题(显然,更多的是数据帧格式):
2017,207,2018,2018,201,201,2018年
我正在编写一些代码来解决这个问题,但是,我不断地出现错误,并希望有人能为我指明正确的方向。
for i in range(len(Rcols)):
dfs[i] = data.filter(regex=f'{Rcols[i]}-')
dfs[i]['Engine'] = data['Operation_ID:-PARAMETER_NAME:']
dfs[i].set_index('Engine',inplace=True)
dfs[i][f'{Rcols[i]}-DATE_TIME_START']=pd.to_datetime(dfs[i][f'{Rcols[i]}-DATE_TIME_START'],errors = 'ignore')
dfs[i].sort_values(by=f'{Rcols[i]}-DATE_TIME_START',ascending = True ,inplace=True)
for index, item in enumerate(dfs[i][f'{Rcols[i]}-DATE_TIME_START']):
if dfs[i][f'{Rcols[i]}-DATE_TIME_START'][index + 1] >= dfs[i][f'{Rcols[i]}-DATE_TIME_START'][index]:
continue
else:
dfs[i].drop(dfs[i][index])其中,Rcols只是列标题的列表,导致ID。dfs是一个称为熊猫数据帧的名字的大清单。
谢谢
发布于 2018-07-31 23:16:49
这不是特别的“手册”,但您可以使用pd.Series.shift。下面是一个很小的例子,但是这个原则在一系列日期中同样有效:
df = pd.DataFrame({'Years': [2017,2017,2018,2018,2018,2017,2018,2018]})
mask = df['Years'].shift() > df['Years']
df = df[~mask]
print(df)
Years
0 2017
1 2017
2 2018
3 2018
4 2018
6 2018
7 2018请注意,自2017年以来,索引5的行是如何被删除的&< 2018 (前一行)。您可以通过for循环将其扩展到多个列。
在迭代行时,不应在任何情况下修改它们。这是在pd.DataFrame.iterrows文档中详细说明的。
您应该永远不要修改--您正在迭代的东西。这并不能保证在所有情况下都能奏效。根据数据类型的不同,迭代器返回一个副本,而不是一个视图,对其进行写入将没有任何效果。
然而,正如上面所述,当有一个矢量化的解决方案时,这就变得无关紧要了。
https://stackoverflow.com/questions/51622583
复制相似问题