Получить первое ненулевое значение в предыдущих строках в пандах - PullRequest
0 голосов
/ 05 октября 2018

Вот как выглядит мой фрейм данных.Expected_Output - мой желаемый столбец:

   Group  Signal  Ready  Value  Expected_Output
0      1       0      0      3              NaN
1      1       0      1     72              NaN
2      1       0      0      0              NaN
3      1       4      0      0             72.0
4      1       4      0      0             72.0
5      1       4      0      0             72.0
6      2       0      0      0              NaN
7      2       7      0      0              NaN
8      2       7      0      0              NaN
9      2       7      0      0              NaN

Если Signal > 1, то я пытаюсь получить самый последний ненулевой Value в предыдущих строках в пределах Group, где Ready = 1,Итак, в строке 3 Signal = 4, поэтому я хочу получить самый последний ненулевой Value of 72 из строки 1, где Ready = 1.

Как только я смогу получить значение, я могу сделать df.groupby(['Group','Signal']).Value.transform('first')как сигналы появляются неоднократно, как 444, но не уверены, как получить Value.

Ответы [ 2 ]

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

Создайте серию с помощью GroupBy + ffill, затем замаскируйте полученную серию:

s = df.assign(Value_mask=df['Value'].where(df['Ready'].eq(1)))\
      .groupby('Group')['Value_mask'].ffill()

df['Value'] = s.where(df['Signal'].gt(1))

   Group  Signal  Ready  Value
0      1       0      0    NaN
1      1       0      1    NaN
2      1       0      0    NaN
3      1       4      0   72.0
4      1       4      0   72.0
5      1       4      0   72.0
6      2       0      0    NaN
7      2       7      0    NaN
8      2       7      0    NaN
9      2       7      0    NaN
0 голосов
/ 05 октября 2018

IIUC groupby + ffill с логическим назначением

df['Help']=df.Value.where(df.Ready==1).replace(0,np.nan)

df['New']=df.groupby('Group').Help.ffill()[df.Signal>1]
df
Out[1006]: 
   Group  Signal  Ready  Value  Expected_Output  Help   New
0      1       0      0      3              NaN   3.0   NaN
1      1       0      1     72              NaN  72.0   NaN
2      1       0      0      0              NaN   NaN   NaN
3      1       4      0      0             72.0   NaN  72.0
4      1       4      0      0             72.0   NaN  72.0
5      1       4      0      0             72.0   NaN  72.0
6      2       0      0      0              NaN   NaN   NaN
7      2       7      0      0              NaN   NaN   NaN
8      2       7      0      0              NaN   NaN   NaN
9      2       7      0      0              NaN   NaN   NaN
...