#python #pandas #dataframe #numpy
Pandas предоставляет инструменты свертки структур данных для получения сводной информации. Для выполнения операции “логическое ИЛИ” по строкам(axis=1) или столбцам(по умолчанию или axis=0) используется метод any(), аналогично “логическое И” - метод all(). Если у меня есть таблица: import pandas as pd import numpy as np tab1 = pd.DataFrame(np.array([[1,2,3],[10,20,30]])) 0 1 2 0 1 2 3 1 10 20 30 Дальше я проверяю элементы таблицы на условие tab1[tab1>2]. Получаю: 0 1 2 0 NaN NaN 3 1 10.0 20.0 30 tab1>2 0 1 2 0 False False True 1 True True True Свертка по столбцам (tab1 >2).any(): 0 True 1 True 2 True dtype: bool Свертка по строкам (tab1 >2).any(axis = 1) 0 True 1 True dtype: bool Как получить сводную таблицу, использую метод any(), all()? Как этот метод применить практически? Пока я только получила логические переменные в DataFrame. Вариант с маской не срабатывает: #по столбцам maska3 = (tab1>2).all(axis = 0) tab1[maska3] /usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2: UserWarning: Boolean Series key will be reindexed to match DataFrame index. 0 1 2 А должен вывести последний столбец.
Ответы
Ответ 1
In [7]: tab1.loc[:, (tab1 > 2).all()] Out[7]: 2 0 3 1 30 Пояснение: DataFrame для примера: In [15]: df = pd.DataFrame(np.array([[1,2,3],[10,20,30]]), columns=list("abc")) In [16]: df Out[16]: a b c 0 1 2 3 1 10 20 30 Оператор DataFrame[arg] - пытается угадать тип индексирования/фильтрования. Если в качестве аргумента передан вектор булевых значений, длина которого совпадает с числом строк DataFrame, значит пользователь фильтрует строки, использую "булеву максу". In [17]: df[[True, False]] Out[17]: a b c 0 1 2 3 В противном случае пользователь пытается выбрать столбцы DataFrame: In [19]: df["a"] Out[19]: 0 1 1 10 Name: a, dtype: int32 In [20]: df[["a", "c"]] Out[20]: a c 0 1 3 1 10 30 Для более тонкой/гибкой выборки лучше использовать selector's: DataFrame.loc[, ] - selection by label DataFrame.iloc[ , ] - selection by position
Комментариев нет:
Отправить комментарий