计算到具有特定值的行的距离

时间:2018-09-23 22:08:50

标签: python pandas

我正在处理与熊猫相关的数据,其中需要在某个位置进行维护工作。每个站点每四年进行一次维护。我想查找自每个站点上次维护操作以来的时间。在下面的示例中,我仅在此处给出两个站点,但是在原始数据集中,我有成千上万个站点。我的数据仅涵盖2014年至2017年。

Action = 0表示当年未执行任何操作,Action = 1表示已执行某些操作。度量是与动作效果相关的性能读数。该行动可以在任何一年发生。我知道如果该动作是在Y年执行的,那么以前的维护是在Y-4年执行的。

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

给出该数据集;首先,我想要一个像这样的临时数据集:

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

然后,我想拥有:

Years_Since_Last_Action         Mean_Measurement
        1                            70
        2                            105
        3                            175
        4                            275

谢谢!

3 个答案:

答案 0 :(得分:4)

您的第一个问题

s=df.loc[df.Action==1,['Site','Year']].set_index('Site') # get all year have the action and map back to the whole dataframe
df['Newyear']=df.Site.map(s.Year)
s1=df.Year-df.Newyear
df['action since last year']=np.where(s1<=0,s1+4,s1)# using np.where get the condition
df
Out[167]: 
  Site  Year  Action  Measurement  Newyear  action since last year
0    A  2014       0          100     2016                       2
1    A  2015       0          150     2016                       3
2    A  2016       1          300     2016                       4
3    A  2017       0           80     2016                       1
4    B  2014       0          200     2015                       3
5    B  2015       1          250     2015                       4
6    B  2016       0           60     2015                       1
7    B  2017       0          110     2015                       2

第二个问题

df.groupby('action since last year').Measurement.mean()
Out[168]: 
action since last year
1     70
2    105
3    175
4    275
Name: Measurement, dtype: int64

答案 1 :(得分:3)

首先,使用groupby*fill和一点算术来构建您的中间语言。

v = (df.Year
       .where(df.Action.astype(bool))
       .groupby(df.Site)
       .ffill()
       .bfill()
       .sub(df.Year))
df['Years_Since_Last_Action'] = np.select([v > 0, v < 0], [4 - v, v.abs()], default=4)

df
  Site  Year  Action  Measurement  Years_Since_Last_Action
0    A  2014       0          100                      2.0
1    A  2015       0          150                      3.0
2    A  2016       1          300                      4.0
3    A  2017       0           80                      1.0
4    B  2014       0          200                      3.0
5    B  2015       1          250                      4.0
6    B  2016       0           60                      1.0
7    B  2017       0          110                      2.0

下一步,

df.groupby('Years_Since_Last_Action', as_index=False).Measurement.mean()

   Years_Since_Last_Action  Measurement
0                      1.0           70
1                      2.0          105
2                      3.0          175
3                      4.0          275

答案 2 :(得分:2)

怎么样:

delta_year = df.loc[df.groupby("Site")["Action"].transform("idxmax"), "Year"].values
years_since = ((df.Year - delta_year) % 4).replace(0, 4)
df["Years_Since_Last_Action"] = years_since

out = df.groupby("Years_Since_Last_Action")["Measurement"].mean().reset_index()
out = out.rename(columns={"Measurement": "Mean_Measurement"})

这给了我

In [230]: df
Out[230]: 
  Site  Year  Action  Measurement  Years_Since_Last_Action
0    A  2014       0          100                        2
1    A  2015       0          150                        3
2    A  2016       1          300                        4
3    A  2017       0           80                        1
4    B  2014       0          200                        3
5    B  2015       1          250                        4
6    B  2016       0           60                        1
7    B  2017       0          110                        2

In [231]: out
Out[231]: 
   Years_Since_Last_Action  Mean_Measurement
0                        1                70
1                        2               105
2                        3               175
3                        4               275