Создать столбец, указывающий историческое существование указанного значения c на основе другого столбца - PullRequest
2 голосов
/ 27 апреля 2020

Предположим, у меня df ниже:

df = pd.DataFrame({
    'A': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'],
    'B': [False, True, False, False, True, False, False, True]
})

df уже отсортировано по A (очевидно) и времени (по убыванию). Таким образом, для каждой группы, определенной A, значения B сортируются по времени по убыванию. Я хочу добавить столбец C, который для каждой группы равен True, если в прошлом в B было значение True. Результат будет выглядеть так:

    A   B       C
0   a   False   True
1   a   True    False
2   a   False   False
3   a   False   False
4   b   True    True
5   b   False   True
6   b   False   True
7   b   True    False

Я подозреваю, что мне нужно как-то использовать groupby() и idxmax(), но я не смог заставить его работать. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

IIU C вот один из способов:

rev_cs = df[::-1].groupby('A').B.apply(lambda x: x.cumsum().shift(fill_value=0.).gt(0))
df['C'] = rev_cs[::-1]

print(df)

  A      B      C
0  a  False   True
1  a   True  False
2  a  False  False
3  a  False  False
4  b   True   True
5  b  False   True
6  b  False   True
7  b   True  False
3 голосов
/ 27 апреля 2020

IIU C idxmax - это путь с transform

df['New']=df.index<df.iloc[::-1].groupby('A').B.transform('idxmax').sort_index()
df
   A      B    New
0  a  False   True
1  a   True  False
2  a  False  False
3  a  False  False
4  b   True   True
5  b  False   True
6  b  False   True
7  b   True  False

Если все неверно

s1=df.index<df.iloc[::-1].groupby('A').B.transform('idxmax').sort_index()
s2=df.groupby('A').B.transform('any')
df['New']=s1&s2
...