У меня есть DataFrame Pandas с числовыми данными. Для каждого небинарного столбца я хочу определить значения, превышающие его 99-й процентиль, и создать булевскую маску, которую я позже использую для удаления строк с выбросами.Pandas DataFrame применяет функцию удвоения размера DataFrame
Я пытаюсь создать эту булево маску, используя метод apply
, где df
является DataFrame с числовыми данными размером * б следующим образом.
def make_mask(s):
if s.unique().shape[0] == 2: # If binary, return all-false mask
return pd.Series(np.zeros(s.shape[0]), dtype=bool)
else: # Otherwise, identify outliers
return s >= np.percentile(s, 99)
s_bool = df.apply(make_mask, axis=1)
К сожалению, s_bool
выводится как DataFrame с вдвое большим количеством столбцов (т.е. размер * (б * 2)). Первые столбцы b имеют имена 1, 2, 3 и т. Д. И заполнены нулевыми значениями. Второй столбец b представляется подходящей маской.
Почему метод apply
удваивает размер DataFrame? К сожалению, Pandas apply documentation не предлагает полезные подсказки.
Вы уверены, что вы выложили правильный код? 'raw = True' означает, что функция передается' ndarray', а объекты 'ndarray' не имеют уникального метода. Я попробовал его с 'raw = False', и он работал нормально. – TheBlackCat
Неплохо, аргумент 'raw' не должен указываться так, чтобы он был установлен как' False' неявно. Удвоение столбцов происходит, когда я вообще не устанавливаю этот аргумент. –
Я попробовал новую версию со случайным DataFrame и не смог воспроизвести проблему: 'df = pd.DataFrame (np.random.random ((50,20)), columns = tuple ('abcdefghijklmnopqrstuvwxyz' [: 20]) , index = np.arange (0,5, .1)) ' – TheBlackCat