Найти все строки с разными значениями в столбцах 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)]