Получение лет после события - PullRequest
0 голосов
/ 06 октября 2018

Я работаю над набором данных с пандами, в котором выполняются работы по техническому обслуживанию на месте.Техническое обслуживание выполняется через произвольные интервалы, иногда через год, а иногда и никогда.Я хочу найти годы с момента последнего действия по обслуживанию на каждом сайте, если на этом сайте было выполнено какое-либо действие.Для сайта может быть несколько действий, а действия могут быть случайными.За годы, предшествующие первому действию, невозможно узнать годы, прошедшие с момента действия, поскольку этой информации нет в наборе данных.В следующем примере я приведу только два сайта, но в исходном наборе данных их тысячи.Мои данные охватывают только 2014–2017 годы.

Действие = 0 означает, что в этом году не было выполнено никаких действий, Действие = 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

Обратите внимание, что 2015 год отфильтрован для сайта B, поскольку этот год предшествует первому действию для этого сайта.

Большое спасибозаранее!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я сам написал код.Это грязно, но делает работу за меня.:) Решение предполагает, что df_select имеет целочисленный индекс.

df_select = (df_select[df_select['Site'].map((df_select.groupby('Site')['Action'].max() == 1))])
years_since_action = pd.Series(dtype='int64')
gbo = df_select.groupby('Site')
for (key,group) in gbo:
    indices_with_ones = group[group['Action']==1].index
    indices = group.index
    group['Years_since_action'] = 0
    group.loc[indices_with_ones,'Years_since_action'] = 1

    for idx_with_ones in indices_with_ones.sort_values(ascending=False):
        for idx in indices:
            if group.loc[idx,'Years_since_action']==0:
                if idx>idx_with_ones:
                    group.loc[idx,'Years_since_action'] = idx - idx_with_ones + 1


    years_since_action = years_since_action.append(group['Years_since_action'])

df_final = pd.merge(df_select,pd.DataFrame(years_since_action),how='left',left_index=True,right_index=True)
0 голосов
/ 06 октября 2018

Вот как я подойду к нему:

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]

enter image description here

Это генерирует желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...