Pandas groupby + ifelse + добавить новый столбец обратно в исходный df

1

У меня есть dataframe, который выглядит следующим образом. Самый правый столбец - это моя желаемая колонка:

Group   Value1  Value2   TargetColumn   
1        1         2         0
1        2         2         1
1        3         3         1
1        4         4         1
2        6         9         0
2        7         5         0
2        8         6         0
2        9         7         0

Если значение Value2 в заданной строке больше значения Value1 в предыдущей строке, тогда возвращайте 1 else 0. Я хочу выполнить эту операцию ifelse, сгруппированную по Group а затем добавить TargetColumn обратно в исходный фрейм.

Обычно я стараюсь:

import pandas as pd
import numpy as np
df = pd.DataFrame({'Group': [1,1,1,1,2,2,2,2], 'Value1': [1,2,3,4,6,7,8,9], 'Value2': [2,2,3,4,9,5,6,7]})

 df['TargetColumn'] = df.groupby(['Group'])(np.where(['Value2'] > ['Value1'].shift() , 1, 0))
Теги:
pandas
numpy

1 ответ

3
Лучший ответ

Вы можете сравнить по gt (>) столбец Value1 по shift колонке изд Value1, последний литом булевой маски для целых чисел для True/False в 1/0:

df['TargetColumn'] = df['Value2'].gt(df.groupby('Group')['Value1'].shift()).astype(int)

Или используйте numpy.where:

df['TargetColumn'] = np.where(df['Value2'].gt(df.groupby('Group')['Value1'].shift()), 1, 0)

print (df)

   Group  Value1  Value2  TargetColumn
0      1       1       2             0
1      1       2       2             1
2      1       3       3             1
3      1       4       4             1
4      2       6       9             0
5      2       7       5             0
6      2       8       6             0
7      2       9       7             0
  • 0
    Спасибо за отличное решение. Я предполагаю, что pandas.Series.lt меньше. Что я использую для меньше или равно (<=) и больше или равно (> =)?
  • 2
    Конечно, нужно le и ge - lt gt le ge ne eq

Ещё вопросы

Сообщество Overcoder
Наверх
Меню