Найти все строки с разными значениями в столбцах Pandas DataFrame (временной ряд)

Давайте предположим, что у меня есть pandas DataFrame в Python, который показывает имя лидера бизнес-единицы для разных юнитов с течением времени. Это может выглядеть примерно так и может быть воссоздано так:

import pandas as pd
import numpy as np

d = pd.DataFrame({'Boss_January': ['Nina', 'Lena', 'Max', np.NaN], 'Boss_February': ['Nina', 'Emilia','Max','Leonie'],'Boss_March':['Nina','Lena','Mark','Leonie']})

Я хотел бы найти единицы, в которых произошла смена лидера бизнес-единицы, то есть строки, в которых значения в разных столбцах не совпадают.

Результат должен включать в себя блок 1, блок 2 и блок 3 из-за изменений в лидере блока (и пропущенного значения), но исключать блок 0.

Поскольку в реальном DataFrame столбцов намного больше, я не хочу проверять все значения, просматривая строки и проверяя, есть ли Boss_January==Boss_Feb February == Boss_March.

2 ответа

Решение

Вы можете проверить на равенство с первой серией, проверить все значения Trueзатем возьмите негатив:

res = df[~df.eq(df.iloc[:, 0], axis=0).all(1)]

print(res)

  Boss_February Boss_January Boss_March
1        Emilia         Lena       Lena
2           Max          Max       Mark
3        Leonie          NaN     Leonie

Если вам просто нужны индексы, подмножество данных не требуется:

bools = ~df.eq(df.iloc[:, 0], axis=0).all(1)
idx = bools[bools].index

print(idx)

Int64Index([1, 2, 3], dtype='int64')

Ты можешь использовать apply с axis=1 агрегировать столбцы и требовать, чтобы было более одного unique элемент во всех столбцах, как:

d[d.apply(lambda x: len(x.unique())!=1, axis=1)]
Другие вопросы по тегам