熊猫中的手动日期过滤器

时间:2018-07-31 21:47:39

标签: python pandas dataframe indexing

我正在使用熊猫将大型数据集处理为更易于管理的数据帧。我有一个循环,该循环根据前导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数据帧的大量名称。

谢谢

1 个答案:

答案 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的文档中对此进行了详细说明:

  

您应该从不修改要迭代的内容。这不是   保证在所有情况下都能正常工作。根据数据类型,   迭代器返回一个副本而不是一个视图,并且对其进行写入将没有   效果。

但是,如上所述,当有矢量化解决方案可用时,这变得无关紧要。