Панды - падает ли строка ниже строки со значением столбца и тем же идентификатором - PullRequest
0 голосов
/ 05 июня 2018

Я новичок в Пандах.У меня есть фрейм данных Pandas:

df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0]})

Я хочу добавить столбец val2, который указывает, находится ли строка ниже другой строки, имеющей тот же id, что и сама, где val1 == 1.

Результатом будет такой кадр данных, как:

df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0], 'val2': [0, 0, 1, 0, 0, 1, 1]})

Моей первой мыслью было использование оператора apply, но они идут только по строкам.И из моего опыта для петель никогда не бывает ответ.Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Использование groupby + transform.Похоже на холодную скорость, но использует bool преобразование для ненулевых cumsum значений.

df['val2'] = df.groupby('id')['val1'].transform(lambda x: x.cumsum().shift())\
                                     .fillna(0).astype(bool).astype(int)

print(df)

   id  val1  val2
0   1     0     0
1   1     1     0
2   1     0     1
3   2     0     0
4   2     1     0
5   2     0     1
6   2     0     1
0 голосов
/ 05 июня 2018

Давайте попробуем shift + cumsum внутри groupby.

df['val2'] = df.groupby('id').val1.apply(
    lambda x: x.shift().cumsum()
).ge(1).astype(int)

Или в попытке избежать lambda,

df['val2'] = (    
   df.groupby('id')
     .val1.shift()
     .groupby(df.id)
     .cumsum()
     .ge(1)
     .astype(int)
)

df
   id  val1  val2
0   1     0     0
1   1     1     0
2   1     0     1
3   2     0     0
4   2     1     0
5   2     0     1
6   2     0     1
...