python - 获取事件后的年数
问题描述
我正在使用 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 年已被过滤掉,因为该年份早于该站点的第一次操作。
提前谢谢了!
解决方案
这是我将如何处理它:
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]
这会生成所需的输出。
推荐阅读
- python - “BlobServiceClient”对象没有属性“ls_files”
- asp.net-mvc - 如何在 Html.EditorFor 中使用 DefaultValueAttribute 值?
- python - 如何在python中动态地将2个不同的列表添加到字典中
- security - 用户名/密码可以作为一个字符串传递吗?
- python - 无法根据需要使用 python 以 json 格式写入
- android - ANT传输协议:发送Broadcast Messages后读取Parcel
- python - IndexError : 列表索引超出范围
- javascript - 使用全日历“事件作为函数”(在 Vue 中)并返回一个承诺在更新资源时不会填充事件?
- javascript - 为什么我得到 Promise 待处理而不是 Express 响应?
- java - 两个对话框 setAlwaysOnTop(true):第二个生成的对话框在第一个对话框后面