Рекурсивная ссылка на строки в Dataframe - PullRequest
0 голосов
/ 06 января 2019

Кадр данных df определяется следующим образом:

import pandas as pd
df1 = pd.DataFrame({'A':[False,True,True,False,True,True,True,True,False,True,True], 'B':[0,0,0,2,2,1,0,0,1,0,0]}, columns=['A','B'])
df1
        A  B
0   False  0
1    True  0
2    True  0
3   False  2
4    True  2
5    True  1
6    True  0
7    True  0
8   False  1
9    True  0
10   True  0

Всякий раз, когда столбец A равен False, но значение в столбце B равно >0, тогда False следует перемещать в следующую строку, пока B не станет 0. Таким образом, желаемый результат для вышеупомянутого кадра данных -

        A  B
0   False  0
1    True  0
2    True  0
3    True  2
4    True  2
5    True  1
6   False  0
7    True  0
8    True  1
9   False  0
10   True  0

Ответы [ 2 ]

0 голосов
/ 06 января 2019

IIUC

s=(~df1.A).cumsum() 
# get the group key 

groupkey=df1.groupby(s).B.transform('first')>0
# find whether we should include the group when the first B of the group is great than 0 or not

df1.A.update(df1.loc[groupkey&(~(df1.B.gt(0)&(df1.A))),'A'].groupby(s).shift().fillna(True)) 
# using update 
df1
        A  B
0   False  0
1    True  0
2    True  0
3    True  2
4    True  2
5    True  1
6   False  0
7    True  0
8    True  1
9   False  0
10   True  0

Подробнее

~(df1.B.gt(0)&(df1.A)) # exclude those A equal to True and B great than 0 row
0      True
1      True
2      True
3      True
4     False
5     False
6      True
7      True
8      True
9      True
10     True
dtype: bool
0 голосов
/ 06 января 2019

Полагаю, это не оптимально, но, по крайней мере, работает.

df1['to_move'] = ((df1['A']==False) & (df1['B']>0))
indexes_to_move = list(df1[df1['to_move']].index)
for ind in indexes_to_move:
    temp = df1.loc[ind:,'B']
    to_change = temp[temp==0].index.min()
    df1.loc[ind, 'A'] = True
    df1.loc[to_change, 'A'] = False
del df1['to_move']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...