
При работе с табличными данными в Python часто требуется извлечь не один, а два диапазона столбцов одновременно. Это актуально при анализе финансовых отчетов, научных экспериментов или больших CSV-файлов с десятками показателей. Например, из набора данных с 20 столбцами может понадобиться выбрать диапазоны с 2 по 5 и с 10 по 15 столбцы для дальнейшей обработки.
В библиотеке pandas существуют разные подходы: использование списка имен столбцов, срезов через iloc или комбинированные фильтры с loc. Выбор метода зависит от того, известны ли точные имена колонок или только их позиции. Например, df.iloc[:, 1:5].join(df.iloc[:, 9:15]) позволяет объединить два диапазона по индексам, сохраняя порядок исходных данных.
Важно учитывать производительность при работе с большими таблицами: объединение двух диапазонов через concat быстрее, чем поэлементное объединение через циклы. Также стоит проверять наличие пропущенных столбцов, чтобы избежать ошибок индексации. Раннее планирование структуры данных упрощает выбор диапазонов и минимизирует вероятность дублирования или пропуска столбцов.
Использование loc для выбора нескольких диапазонов столбцов

Метод loc позволяет выбрать несколько диапазонов столбцов, указывая их имена через списки. Например, для выбора столбцов 'A'–'C' и 'F'–'H' используется синтаксис: df.loc[:, list(df.loc[:, 'A':'C'].columns) + list(df.loc[:, 'F':'H'].columns)]. Такой подход сохраняет порядок столбцов и масштабируется на большие DataFrame.
Для динамического формирования диапазонов можно использовать метод columns.get_loc() для получения индексов и объединять их списками: cols = list(df.columns[start1:end1+1]) + list(df.columns[start2:end2+1]); df.loc[:, cols]. Это позволяет адаптировать выбор под изменяющуюся структуру данных.
Если имена столбцов содержат шаблоны, допустимо комбинировать диапазоны с фильтрацией через df.columns.str.contains(), формируя итоговый список для loc. Это повышает точность выбора и уменьшает риск пропуска нужных столбцов.
Одновременная фильтрация строк и нескольких диапазонов столбцов выполняется так: df.loc[row_condition, list(df.columns[start1:end1+1]) + list(df.columns[start2:end2+1])]. Такой способ позволяет создавать подтаблицы без промежуточных объектов.
Применение iloc при работе с числовыми индексами столбцов

Метод iloc позволяет выбирать столбцы по их числовым позициям, что особенно удобно при работе с большими DataFrame, где имена столбцов могут быть длинными или изменяться. Индексация начинается с нуля. Например, df.iloc[:, 0] возвращает первый столбец, а df.iloc[:, 2:5] – столбцы с третьего по пятый включительно.
Для выбора двух диапазонов столбцов одновременно используют конкатенацию массивов индексов через numpy.r_ или list. Пример:
import numpy as np
df.iloc[:, np.r_[0:2, 4:6]]
В этом примере выбираются столбцы с 0 по 1 и с 4 по 5. Такой подход предотвращает создание промежуточных DataFrame и ускоряет обработку при больших объёмах данных.
Можно использовать явное перечисление индексов для нестандартных комбинаций:
df.iloc[:, [0, 2, 5]]
Этот метод эффективен для динамического выбора столбцов. Например, если нужно выбрать первые два и последние два столбца, можно вычислить их позиции так:
cols = list(range(2)) + list(range(-2, 0))
df.iloc[:, cols]
Таблица ниже иллюстрирует соответствие числовых индексов и имен столбцов:
| Индекс | Имя столбца |
|---|---|
| 0 | Дата |
| 1 | Температура |
| 2 | Влажность |
| 3 | Ветер |
| 4 | Осадки |
| 5 | Давление |
При работе с числовыми индексами iloc исключает ошибки, связанные с дублированием имён столбцов и позволяет программно формировать выборку без жесткой привязки к названиям.
Комбинирование списков и срезов для сложных выборок

Если необходимо выбрать столбцы по именам, можно совместить срез с явным списком: df.loc[:, list(df.columns[1:4]) + ['F', 'G']]. Такой подход обеспечивает читаемость кода и минимизирует вероятность ошибок при работе с большими таблицами.
Для динамического формирования сложных диапазонов удобно использовать функции range() и генераторы списков. Например, cols = list(range(0, 3)) + [7, 9] + list(range(12, 15)) и затем df.iloc[:, cols]. Это позволяет адаптировать выборку под изменяющийся набор данных без ручного переписывания индексов.
При работе с DataFrame с сотнями столбцов рекомендуется избегать повторного создания списков вручную и использовать функции фильтрации по условиям: cols = [c for c in df.columns if 'sales' in c or 'profit' in c]. После этого выборка выполняется через df[cols], что ускоряет обработку и упрощает поддержку кода.
Комбинирование списков и срезов особенно полезно при построении аналитических панелей или выборке подмножеств данных для визуализации, где одновременное использование непрерывных и разрозненных диапазонов делает код компактным и понятным.
Фильтрация столбцов по именам и позициям одновременно

Для одновременной фильтрации столбцов по именам и позициям в Python с использованием Pandas можно комбинировать метод loc и логические условия. Например, если требуется выбрать столбцы с именами 'A', 'C' и все столбцы с позициями от 2 до 4, можно использовать следующий подход:
import pandas as pd
df = pd.DataFrame({
'A': range(5),
'B': range(5, 10),
'C': range(10, 15),
'D': range(15, 20),
'E': range(20, 25)
})
cols_to_select = [col for i, col in enumerate(df.columns) if col in ['A', 'C'] or 2 <= i <= 4]
df_filtered = df[cols_to_select]
В этом примере enumerate обеспечивает доступ к индексам столбцов, а условие col in ['A', 'C'] or 2 <= i <= 4 объединяет фильтрацию по имени и позиции. В результате будут выбраны столбцы 'A', 'C', 'C', 'D' и 'E' с сохранением исходного порядка.
Для больших таблиц рекомендуется сначала определить позиции нужных столбцов через get_indexer, чтобы избежать повторного перебора:
positions = df.columns.get_indexer(['C', 'D', 'E'])
cols_to_select = [col for i, col in enumerate(df.columns) if col in ['A', 'C'] or i in positions]
df_filtered = df[cols_to_select]
Такой подход ускоряет выборку при работе с сотнями или тысячами столбцов и минимизирует вероятность дублирования или пропуска нужных данных.
При необходимости можно создать функцию для повторного использования фильтрации по имени и позиции, что повышает читаемость кода и облегчает поддержку:
def filter_columns(df, names=[], positions=[]):
pos_set = set(positions)
return df[[col for i, col in enumerate(df.columns) if col in names or i in pos_set]]
Использование этой функции обеспечивает точный контроль над выборкой и упрощает комбинированную фильтрацию для любых таблиц.
Создание нового DataFrame с двумя диапазонами столбцов

Для извлечения нескольких диапазонов столбцов в pandas используется сочетание методов iloc и объединения с помощью concat. Предположим, у нас есть DataFrame df с 12 столбцами, и требуется выбрать столбцы с 1 по 3 и с 7 по 9.
Пошаговый подход:
- Определяем диапазоны с помощью срезов:
range(0, 3)иrange(6, 9). - Используем
ilocдля выборки столбцов по индексам. - Объединяем выбранные части через
pd.concatпо осиaxis=1.
Пример кода:
import pandas as pd
# Исходный DataFrame
df = pd.DataFrame({
'A': range(10), 'B': range(10, 20), 'C': range(20, 30),
'D': range(30, 40), 'E': range(40, 50), 'F': range(50, 60),
'G': range(60, 70), 'H': range(70, 80), 'I': range(80, 90),
'J': range(90, 100), 'K': range(100, 110), 'L': range(110, 120)
})
# Диапазоны столбцов
cols1 = df.iloc[:, 0:3]
cols2 = df.iloc[:, 6:9]
# Создание нового DataFrame
new_df = pd.concat([cols1, cols2], axis=1)
Рекомендации:
- Используйте именованные срезы, чтобы код оставался читаемым.
- Для динамического выбора диапазонов можно хранить индексы в списках:
cols_idx = list(range(0,3)) + list(range(6,9))и передавать их вiloc. - Проверяйте порядок столбцов при объединении, если он критичен для дальнейшей обработки данных.
- При работе с большим количеством столбцов эффективнее использовать
df.iloc[:, cols_idx], чем несколькоconcat.
Метод позволяет быстро формировать новый DataFrame, состоящий только из нужных диапазонов столбцов, сохраняя порядок и тип данных исходного набора.
Обновление данных только в выбранных диапазонах столбцов
Для обновления данных в двух диапазонах столбцов в Python удобнее всего использовать библиотеку pandas. Предположим, что у нас есть DataFrame df с 10 столбцами, и необходимо изменить значения только в столбцах с индексами 2–4 и 7–8.
Сначала выделим диапазоны через iloc и присвоим новые данные:
df.iloc[:, 2:5] = df.iloc[:, 2:5].apply(lambda x: x * 2)
df.iloc[:, 7:9] = df.iloc[:, 7:9].apply(lambda x: x + 10)
Важно, что индексация iloc исключает верхнюю границу, поэтому для диапазона 2–4 используется 2:5. Это позволяет избежать сдвига столбцов и обновления лишних данных.
Альтернативно, можно объединить несколько диапазонов через numpy.r_ для более компактного обращения:
cols = np.r_[2:5, 7:9]
df.iloc[:, cols] = df.iloc[:, cols].applymap(lambda x: x * 3)
Метод applymap обеспечивает применение функции к каждому элементу выбранных столбцов, что удобно при сложных вычислениях или нормализации данных.
При работе с конкретными диапазонами столбцов рекомендуется заранее проверять размерность df.iloc[:, cols] и тип данных, чтобы избежать ошибок преобразования или переполнения памяти.
Такой подход позволяет точно контролировать, какие столбцы подвергаются обновлению, без затрагивания остального DataFrame.
Вопрос-ответ:
Как выбрать два диапазона столбцов в DataFrame с помощью pandas?
В pandas можно выбрать несколько диапазонов столбцов, указав их имена или позиции через список. Например, если нужны столбцы с 'A' по 'C' и с 'F' по 'H', можно использовать объединение списков: df[list(df.loc[:, 'A':'C'].columns) + list(df.loc[:, 'F':'H'].columns)]. Это создаст новый DataFrame, содержащий только нужные диапазоны столбцов.
Можно ли выбрать диапазоны столбцов по их индексам, а не по именам?
Да, для этого используется метод iloc. Например, df.iloc[:, list(range(0, 3)) + list(range(5, 8))] выберет столбцы с 0 по 2 и с 5 по 7. Это удобно, когда имена столбцов неизвестны или содержат сложные символы.
Как объединить несколько диапазонов столбцов в одну операцию?
Можно собрать все нужные диапазоны в один список с помощью функции list() и объединения списков. Например: columns_to_select = list(df.columns[0:3]) + list(df.columns[5:8]); df_selected = df[columns_to_select]. Такой способ позволяет гибко управлять выборкой столбцов и легко добавлять новые диапазоны.
Есть ли способ выбрать два диапазона столбцов с использованием условия по имени?
Да, можно использовать фильтрацию с помощью метода filter или list comprehension. Например, df[[col for col in df.columns if col.startswith('A') or col.startswith('F')]] выберет все столбцы, имена которых начинаются с 'A' или 'F'. Это удобно для динамической фильтрации столбцов по шаблону без точного указания индексов.
