Найти все строки, которые имеют разные значения в столбцах Pandas DataFrame (временной ряд) - PullRequest
0 голосов
/ 05 ноября 2018

Давайте предположим, что у меня есть 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 ]

0 голосов
/ 05 ноября 2018

Вы можете проверить равенство с первой серией, проверить все значения 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')
0 голосов
/ 05 ноября 2018

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

d[d.apply(lambda x: len(x.unique())!=1, axis=1)]
...