При работе с табличными данными в Pandas часто возникает необходимость выбрать не один, а сразу несколько несмежных диапазонов столбцов. Например, если необходимо анализировать показатели с января по март и с июля по сентябрь, стандартный срез с использованием DataFrame.iloc или DataFrame.loc становится неудобным. Простое перечисление столбцов вручную не масштабируется, особенно при работе с большими наборами данных.
Для выбора двух диапазонов столбцов можно использовать комбинации функций loc и iloc с массивами имен или диапазонами индексов. В случае имен столбцов, удобно использовать DataFrame.columns.get_loc для определения индексов по именам и далее задать срезы через numpy.r_. Это позволяет объединять диапазоны в один массив и обращаться к ним как к единому набору.
Если столбцы упорядочены по шаблону (например, месяц_1, месяц_2 и т.д.), их можно фильтровать через генераторы списков и str.contains или str.startswith. Это снижает вероятность ошибки и облегчает автоматизацию. Подобный подход также хорошо сочетается с логикой фильтрации, когда названия столбцов известны лишь частично.
Выбор нескольких диапазонов – это не просто удобство, а способ повысить читаемость и гибкость кода. Вместо громоздких конструкций из нескольких concat или drop можно получить читаемый и повторно используемый способ извлечения данных. Дальнейшая работа с выбранными диапазонами становится проще как для визуального анализа, так и для автоматизированной обработки.
Выбор двух непересекающихся диапазонов столбцов по именам в pandas
Для выбора двух непересекающихся диапазонов столбцов по именам используйте индексирование через loc
с объединением двух срезов по pd.concat
или DataFrame.loc[:, cols1 + cols2]
, где cols1
и cols2
– списки имен столбцов.
Пример: если нужно выбрать столбцы от 'A'
до 'C'
и от 'G'
до 'I'
в порядке следования в DataFrame:
import pandas as pd
df = pd.DataFrame(columns=list('ABCDEFGHIJ'))
# Первый диапазон: A до C включительно
cols1 = df.loc[:, 'A':'C'].columns.tolist()
# Второй диапазон: G до I включительно
cols2 = df.loc[:, 'G':'I'].columns.tolist()
# Объединение двух диапазонов
result = df.loc[:, cols1 + cols2]
При использовании loc
с именованными диапазонами важно, чтобы столбцы шли в правильном порядке в DataFrame.columns
. Если порядок нарушен, используйте get_loc
из df.columns
для точного позиционирования:
cols = df.columns
start1, end1 = cols.get_loc('A'), cols.get_loc('C')
start2, end2 = cols.get_loc('G'), cols.get_loc('I')
cols1 = cols[start1:end1+1]
cols2 = cols[start2:end2+1]
result = df.loc[:, cols1.tolist() + cols2.tolist()]
Для проверки отсутствия пересечений применяйте set(cols1).isdisjoint(cols2)
. Если возвращается False
, диапазоны пересекаются и их нужно скорректировать.
Использование числовых индексов для выбора двух диапазонов столбцов
В библиотеке pandas для выборки нескольких диапазонов столбцов по позициям удобно использовать метод .iloc
. Это особенно полезно, если известны только числовые индексы столбцов, а не их имена.
Для выбора, например, первых трёх столбцов и последних двух, можно воспользоваться функцией pd.concat
или передать список массивов в .iloc
:
df.iloc[:, list(range(0, 3)) + list(range(-2, 0))]
Если необходимо выбрать столбцы с индексами 1–3 и 7–9, используйте:
df.iloc[:, list(range(1, 4)) + list(range(7, 10))]
Для повышения читаемости можно сохранить диапазоны отдельно:
cols1 = range(1, 4)
cols2 = range(7, 10)
df.iloc[:, list(cols1) + list(cols2)]
Рекомендуется избегать вложенных циклов и условных выражений при построении диапазонов – вместо этого используйте range
с фиксированными границами и объединяйте их через +
.
Для получения индексов по названиям столбцов предварительно вызовите df.columns.get_loc('имя')
, затем примените .iloc
по числовым позициям.
Если используется NumPy, можно применить np.r_
для объединения диапазонов:
df.iloc[:, np.r_[0:3, 7:10]]
Объединение нескольких срезов столбцов в один DataFrame
Для объединения нескольких диапазонов столбцов из одного DataFrame в Python используется функция pd.concat()
с параметром axis=1
. Это позволяет выбрать несмежные группы столбцов и соединить их в новую таблицу без копирования всех данных вручную.
Пример. Имеется DataFrame df
с 10 столбцами. Требуется объединить столбцы с 0 по 2 и с 5 по 7 включительно:
import pandas as pd
# Примерные данные
df = pd.DataFrame({
f'col{i}': range(5) for i in range(10)
})
# Выбор нужных срезов
slice1 = df.iloc[:, 0:3]
slice2 = df.iloc[:, 5:8]
# Объединение в новый DataFrame
result = pd.concat([slice1, slice2], axis=1)
Если названия столбцов пересекаются, используйте параметр keys
или переименуйте колонки с помощью .add_prefix()
или .rename()
:
slice1 = slice1.add_prefix("group1_")
slice2 = slice2.add_prefix("group2_")
result = pd.concat([slice1, slice2], axis=1)
Рекомендуется избегать df[['col1', 'col2', ...]]
, если диапазоны большие и не подряд. Для таких случаев .iloc
и np.r_
или pd.concat()
обеспечивают более читаемый и масштабируемый код.
Выбор двух диапазонов столбцов с помощью loc и iloc
Метод loc
используется для выборки по меткам. Чтобы выбрать два диапазона столбцов, укажите их через pd.Index
или объедините с join
или concat
. Например, если нужно выбрать столбцы от ‘A’ до ‘C’ и от ‘F’ до ‘H’:
df.loc[:, df.columns.isin(df.loc[:, 'A':'C'].columns.union(df.loc[:, 'F':'H'].columns))]
Для iloc
применяются числовые индексы. Например, чтобы выбрать столбцы с индексами 0–2 и 5–7:
df.iloc[:, list(range(0, 3)) + list(range(5, 8))]
Чтобы избежать повторяющихся операций, можно сохранить списки в переменные:
cols = list(range(0, 3)) + list(range(5, 8))
df_selected = df.iloc[:, cols]
Для loc
с метками необходимо убедиться, что метки уникальны и отсортированы по порядку, иначе возможны ошибки. Метод iloc
не зависит от меток, что делает его предпочтительным при числовом доступе к диапазонам.
Работа с пропущенными значениями при выборке диапазонов столбцов
При извлечении нескольких диапазонов столбцов из DataFrame важно учитывать наличие пропущенных значений, поскольку они могут исказить расчёты и повлиять на корректность выборки. Ниже приведены практические приёмы работы с пропущенными значениями в рамках выбора нескольких столбцов по диапазону.
- Перед выборкой проверьте наличие пропусков с помощью
df.isnull().sum()
. Это поможет понять, какие столбцы требуют обработки. - Если выборка охватывает смежные диапазоны, объедините нужные столбцы с использованием
pd.concat()
:selected = pd.concat([df.iloc[:, 2:6], df.iloc[:, 8:11]], axis=1)
Убедитесь, что объединённый результат не содержит критически важных пропусков.
- Если важны только полные строки без NaN, используйте
dropna()
после выборки:cleaned = selected.dropna()
Это удалит строки, где хотя бы в одном из выбранных столбцов есть пропущенные значения.
- Для анализа с частично заполненными данными используйте
fillna()
:filled = selected.fillna(0)
Заменяйте NaN только после оценки влияния на расчёты. Ноль подходит не во всех случаях.
- Если необходимо сохранить только столбцы без пропусков, отфильтруйте их:
selected = selected.loc[:, selected.notna().all()]
Это оставит только полностью заполненные столбцы из выбранного диапазона.
Проверяйте, как обработка пропусков влияет на размер и структуру выборки, особенно при дальнейшей агрегации или обучении моделей. Обработка пропущенных данных должна соответствовать задаче, иначе велика вероятность искажения результатов.
Создание функции для многократного выбора разных диапазонов столбцов
Для работы с несколькими диапазонами столбцов в Python удобно использовать функцию, которая будет позволять динамически выбирать несколько участков данных из таблицы (например, из pandas DataFrame). Это особенно полезно, когда необходимо извлечь различные группы столбцов для дальнейшей обработки или анализа.
Пример функции, которая принимает список диапазонов, выглядит следующим образом:
import pandas as pd def select_columns_by_ranges(df, ranges): selected_columns = [] for start, end in ranges: selected_columns.extend(df.columns[start:end+1]) return df[selected_columns]
В этой функции аргумент df
представляет собой DataFrame, а ranges
– список кортежей, каждый из которых определяет диапазон столбцов (от индекса начала до индекса конца, включая оба). Функция возвращает DataFrame, состоящий только из выбранных столбцов.
Пример использования:
# Загрузка данных data = {'A': [1, 2], 'B': [3, 4], 'C': [5, 6], 'D': [7, 8], 'E': [9, 10]} df = pd.DataFrame(data) # Выбор диапазонов ranges = [(0, 1), (3, 4)] result = select_columns_by_ranges(df, ranges) print(result)
В результате выполнения этого кода будут выбраны столбцы ‘A’, ‘B’, ‘D’, ‘E’. Функция гибко позволяет работать с несколькими диапазонами столбцов одновременно, что делает её удобной для сложных выборок.
Важно, что индексы в pandas начинаются с 0, и функции нужно передавать корректные диапазоны, чтобы избежать ошибок при выборке данных. Также стоит учитывать, что при работе с большими наборами данных многократное использование диапазонов может повлиять на производительность, если выборки слишком большие.