首页 > 解决方案 > 获取事件后的年数

问题描述

我正在使用 pandas 处理一个数据集,其中在某个位置完成了维护工作。维护是随机进行的,有时一年,有时从不。如果在该站点上进行了操作,我想查找自每个站点上一次维护操作以来的年数。一个站点可以有多个操作,并且操作的发生是随机的。对于第一次行动之前的年份,不可能知道行动之后的年份,因为该信息不在数据集中。在下面的示例中,我只给出了两个站点,但在原始数据集中,我有数千个。我的数据仅涵盖 2014 年至 2017 年。

Action = 0 表示该年未执行任何操作,Action = 1 表示已执行某些操作。测量是与动作效果相关的性能读数。该行动可以在任何一年发生。

Site  Year   Action  Measurement
 A   2014     1         100
 A   2015     0         150
 A   2016     0         300
 A   2017     0         80
 B   2014     0         200
 B   2015     1         250
 B   2016     1         60
 B   2017     0         110

给定这个数据集;我想要一个这样的数据集:

Item  Year   Action  Measurement  Years_Since_Last_Action
 A   2014     1         100           1
 A   2015     0         150           2
 A   2016     0         300           3
 A   2017     0         80            4
 B   2015     1         250           1
 B   2016     1         60            1
 B   2017     0         110           2

请注意,站点 B 的 2015 年已被过滤掉,因为该年份早于该站点的第一次操作。

提前谢谢了!

标签: pythonpandas

解决方案


这是我将如何处理它:

import pandas as pd

from io import StringIO

import numpy as np

s = '''Site  Year   Action  Measurement
 A   2014     1         100
 A   2015     0         150
 A   2016     0         300
 A   2017     0         80
 B   2014     0         200
 B   2015     1         250
 B   2016     1         60
 B   2017     0         110
 '''

ss = StringIO(s)

df = pd.read_csv(ss, sep=r"\s+")


df_maintain = df[df.Action==1][['Site', 'Year']]
df_maintain.reset_index(drop=True, inplace=True)
df_maintain

def find_last_maintenance(x):
    df_temp = df_maintain[x.Site == df_maintain.Site]

    gap = [0]

    for ind, row in df_temp.iterrows():

        if (x.Year >= row['Year']):
            gap.append(x.Year - row['Year'] + 1)



    return gap[-1]

df['Gap'] = df.apply(find_last_maintenance, axis=1)

df = df[df.Gap !=0]

在此处输入图像描述

这会生成所需的输出。


推荐阅读