我正在使用熊猫将大型数据集处理为更易于管理的数据帧。我有一个循环,该循环根据前导ID号将数据帧分成较小的数据帧,然后按日期列进行排序。但是,我注意到在一切运行之后,仍然存在一些日期无法正确排序的问题。我想创建一个手动过滤器,该过滤器基本上遍历日期列,并检查下一个日期是否大于或等于上一个日期。理想情况下,这将消除日期列可能会出现类似问题的问题(显然采用数据框格式):
[2017,2017,2018,2018,2018,2017,2018,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是调用pandas数据帧的大量名称。
谢谢
答案 0 :(得分:0)
这不是特别的“手动”,但是您可以使用pd.Series.shift
。这是一个 minimum 的示例,但是该原理对于一系列日期同样适用:
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年<2018年以来,索引5的行是如何删除的(前一行)。您可以通过for
循环将此扩展为多列。
在遍历行时,您在任何情况下都不应修改。 pd.DataFrame.iterrows
的文档中对此进行了详细说明:
您应该从不修改要迭代的内容。这不是 保证在所有情况下都能正常工作。根据数据类型, 迭代器返回一个副本而不是一个视图,并且对其进行写入将没有 效果。
但是,如上所述,当有矢量化解决方案可用时,这变得无关紧要。