Обратная засыпка данных в Python pandas на основе двух условий - PullRequest
3 голосов
/ 25 сентября 2019

У меня есть такой кадр данных:

   Bool   Hour
0  False  12
1  False  24
2  False  12
3  False  24
4  True   12
5  False  24
6  False  12
7  False  24
8  False  12
9  False  24
10 False  12
11 True   24

, и я хотел бы заполнить значение True в столбце «Bool» до того момента, когда «Hour» впервые достигнет «12».Результат будет примерно таким:

   Bool   Hour  Result
0  False  12    False
1  False  24    False
2  False  12    True      <- desired backfill
3  False  24    True      <- desired backfill
4  True   12    True
5  False  24    False
6  False  12    False
7  False  24    False
8  False  12    False
9  False  24    False
10 False  12    True      <- desired backfill
11 True   24    True

Любая помощь с благодарностью!Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Это немного сложно достичь, здесь мы можем использовать groupby с idxmax

s=(~df.Bool&df.Hour.eq(12)).iloc[::-1].groupby(df.Bool.iloc[::-1].cumsum()).transform('idxmax')
df['result']=df.index>=s.iloc[::-1]
df
Out[375]: 
     Bool  Hour  result
0   False    12   False
1   False    24   False
2   False    12    True
3   False    24    True
4    True    12    True
5   False    24   False
6   False    12   False
7   False    24   False
8   False    12   False
9   False    24   False
10  False    12    True
11   True    24    True
1 голос
/ 25 сентября 2019

создать идентификатор группы s для последовательных False и отделить True от них.Группировка по Hour равна 12 при использовании s.Используйте преобразование sum и cumsum, чтобы получить счетчик True в 12 снизу вверх в каждой группе и вернуть True в 0 и or со значениями Bool

s = df.Bool.ne(df.Bool.shift()).cumsum()
s1 = df.where(df.Bool).Bool.bfill()
g = df.Hour.eq(12).groupby(s)
df['bfill_Bool'] = (g.transform('sum') - g.cumsum()).eq(0) & s1 | df.Bool

Out[905]:
     Bool  Hour  bfill_Bool
0   False    12       False
1   False    24       False
2   False    12        True
3   False    24        True
4    True    12        True
5   False    24       False
6   False    12       False
7   False    24       False
8   False    12       False
9   False    24       False
10  False    12        True
11   True    24        True
1 голос
/ 25 сентября 2019

IIUC, вы можете сделать:

s = df['Bool'].shift(-1)
df['Result'] = df['Bool'] | s.where(s).groupby(df['Hour'].eq(12).cumsum()).bfill()

Вывод:

     Bool  Hour  Result
0   False    12   False
1   False    24   False
2   False    12    True
3   False    24    True
4    True    12    True
5   False    24   False
6   False    12   False
7   False    24   False
8   False    12   False
9   False    24   False
10  False    12    True
11   True    24    True
...