НейроАгент

Полное руководство: выбор нескольких столбцов в Pandas

Узнайте правильный способ выбора нескольких столбцов в DataFrame Pandas. Узнайте, почему двойные скобки обязательны и избегайте распространенных ошибок с устаревшими методами, такими как индексатор ix.

Вопрос

Как выбрать несколько столбцов ‘a’ и ‘b’ из DataFrame Pandas и сохранить их в новый DataFrame?

У меня есть DataFrame со столбцами ‘a’, ‘b’ и ‘c’, и я хочу создать новый DataFrame, содержащий только столбцы ‘a’ и ‘b’.

Мои неудачные попытки:

python
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

Какой правильный способ выбрать несколько столбцов в Pandas и создать новый DataFrame, содержащий только эти столбцы?

НейроАгент

Чтобы выбрать несколько столбцов ‘a’ и ‘b’ из DataFrame Pandas и создать новый DataFrame, следует использовать двойные квадратные скобки со списком имен столбцов: df1 = df[['a', 'b']]. Этот метод возвращает новый DataFrame, содержащий только указанные столбцы, что отличается от одинарных скобок, которые вернут Series при выборе одного столбца.


Содержание


Правильный метод выбора нескольких столбцов

Основной и наиболее прямой метод для выбора нескольких столбцов из DataFrame Pandas — использование двойных квадратных скобок со списком имен столбцов:

python
df1 = df[['a', 'b']]

Это создает новый DataFrame df1, содержащий только столбцы ‘a’ и ‘b’ из исходного DataFrame df. Двойные скобки обязательны, так как они создают список имен столбцов, который ожидает pandas при выборе нескольких столбцов.

Ключевое понимание: При использовании двойных скобок df[['a', 'b']] вы передаете список ['a', 'b'] оператору индексации DataFrame. Это указывает pandas вернуть DataFrame с указанными столбцами, а не Series.

Давайте разберем, почему это работает:

  • Внутренние скобки: Создают список имен столбцов, которые вы хотите выбрать
  • Внешние скобки: Являются оператором индексации DataFrame, который обрабатывает список
  • Результат: Новый DataFrame, содержащий только указанные столбцы

Альтернативные подходы

Хотя метод с двойными скобками является наиболее распространенным, существует несколько других способов выбора нескольких столбцов в pandas:

Использование loc для выбора на основе меток

Индексатор loc предоставляет выбор на основе меток и предлагает большую гибкость:

python
df1 = df.loc[:, ['a', 'b']]

Это явно выбирает все строки (:) и только столбцы ‘a’ и ‘b’. Согласно документации pandas, loc[] используется для выбора на основе меток и особенно полезен, когда вам нужен больший контроль над процессом выбора.

Использование iloc для выбора на основе позиций

Если вы знаете позиции ваших столбцов, а не их имена:

python
df1 = df.iloc[:, [0, 1]]  # Выбираем первые два столбца по позиции

Явное создание нового DataFrame

Вы также можете создать новый DataFrame, передав исходный DataFrame и указав столбцы для включения:

python
df1 = pd.DataFrame(df, columns=['a', 'b'])

Этот метод явный и делает вашу цель ясной — создать новый DataFrame с определенными столбцами.

Использование метода filter()

Для более продвинутых шаблонов выбора столбцов:

python
df1 = df.filter(['a', 'b'])

Метод filter() полезен, когда вы хотите выбирать столбцы на основе шаблонов или регулярных выражений.


Почему ваши попытки не увенчались успехом

Давайте проанализируем, почему ваши неудачные попытки не сработали:

Попытка 1: df['a':'b']

Этот подход использует строковое срезание, которое не работает для выбора столбцов в pandas. Строковое срезание предназначено для выбора на основе меток в pandas, но работает только с индексом, а не с именами столбцов.

  • Почему это не работает: Pandas интерпретирует 'a':'b' как попытку срезать строки от индекса ‘a’ до индекса ‘b’, а не столбцы
  • Что это на самом деле делает: Если ваш DataFrame имеет строки с метками индекса ‘a’ и ‘b’, он выберет эти строки, а не столбцы
  • Правильный подход для срезания строк: df.loc['a':'b', :] для выбора строк от ‘a’ до ‘b’ и всех столбцов

Попытка 2: df.ix[:, 'a':'b']

Индексатор ix устарел с версии pandas 0.20.0 и был полностью удален в pandas 1.0.0. Даже когда он был доступен, этот подход имел проблемы.

  • Почему это не сработало: ix был предназначен для гибридного выбора на основе меток (loc) и позиций (iloc), но он был непоследовательным и склонным к ошибкам
  • Текущие альтернативы: Используйте loc для выбора на основе меток или iloc для выбора на основе позиций
  • Правильный подход: df.loc[:, ['a', 'b']] или df.iloc[:, [0, 1]]

Распространенные ошибки и лучшие практики

Одинарные против двойных скобок

Распространенный источник путаницы — разница между одинарными и двойными скобками:

python
# Одинарная скобка - возвращает Series (1D массив)
series_a = df['a']  # Возвращает pandas Series

# Двойные скобки - возвращает DataFrame (2D массив)
df_ab = df[['a', 'b']]  # Возвращает pandas DataFrame

Как объясняется в обсуждении на Stack Overflow, “вы должны использовать двойные скобки, если выбираете два или более столбца. При выборе одного имени столбца пара одинарных скобок возвращает Series.”

Существование имен столбцов

Всегда проверяйте, что имена столбцов, которые вы пытаетесь выбрать, действительно существуют:

python
# Проверяем существование столбцов перед выбором
if 'a' in df.columns and 'b' in df.columns:
    df1 = df[['a', 'b']]
else:
    print("Один или оба столбца не существуют в DataFrame")

Вопросы производительности

Для больших DataFrame метод с двойными скобками обычно эффективен. Однако, если вам нужно выбирать столбцы многократно, рассмотрите:

python
# Сохраняем имена столбцов в переменной для повторного использования
cols_to_select = ['a', 'b']
df1 = df[cols_to_select]

Практические примеры

Давайте рассмотрим полный пример:

python
import pandas as pd

# Создаем пример DataFrame
data = {
    'a': [1, 2, 3, 4, 5],
    'b': [10, 20, 30, 40, 50],
    'c': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

print("Исходный DataFrame:")
print(df)
print()

# Метод 1: Двойные скобки (наиболее распространенный)
df1 = df[['a', 'b']]
print("Новый DataFrame со столбцами 'a' и 'b':")
print(df1)
print()

# Метод 2: Использование loc
df2 = df.loc[:, ['a', 'b']]
print("Использование loc для выбора столбцов 'a' и 'b':")
print(df2)
print()

# Метод 3: Явное создание нового DataFrame
df3 = pd.DataFrame(df, columns=['a', 'b'])
print("Явное создание нового DataFrame:")
print(df3)

Вывод:

Исходный DataFrame:
   a   b    c
0  1  10  100
1  2  20  200
2  3  30  300
3  4  40  400
4  5  50  500

Новый DataFrame со столбцами 'a' и 'b':
   a   b
0  1  10
1  2  20
2  3  30
3  4  40
4  5  50

Использование loc для выбора столбцов 'a' и 'b':
   a   b
0  1  10
1  2  20
2  3  30
3  4  40
4  5  50

Явное создание нового DataFrame:
   a   b
0  1  10
1  2  20
2  3  30
3  4  40
4  5  50

Пример из реального мира с данными сотрудников

Давайте рассмотрим более реалистичный пример, основанный на демонстрации с GeeksforGeeks:

python
# Определяем данные сотрудников
data = {
    'Name': ['Джай', 'Принси', 'Гаурав', 'Анудж'],
    'Age': [27, 24, 22, 32],
    'Address': ['Дели', 'Канпур', 'Аллахабад', 'Каннаудж'],
    'Qualification': ['Msc', 'MA', 'MCA', 'Phd']
}

# Создаем DataFrame
df = pd.DataFrame(data)

# Выбираем только столбцы Name и Qualification
employee_info = df[['Name', 'Qualification']]

print("Информация о сотрудниках:")
print(employee_info)

Вывод:

Информация о сотрудниках:
    Name Qualification
0    Джай           Msc
1  Принси            MA
2  Гаурав           MCA
3    Анудж           Phd

Расширенный выбор столбцов

Выбор столбцов на основе условий

Вы также можете выбирать столбцы на основе определенных условий:

python
# Выбираем столбцы, содержащие конкретный текст
numeric_cols = df.loc[:, df.columns.str.contains('Age|Qualification')]
print("Столбцы, содержащие 'Age' или 'Qualification':")
print(numeric_cols)

# Выбираем столбцы на основе типа данных
numeric_df = df.select_dtypes(include=['number'])
print("\nТолько числовые столбцы:")
print(numeric_df)

Выбор столбцов с регулярными выражениями

Использование метода filter() с регулярными выражениями:

python
# Выбираем столбцы, начинающиеся с 'A'
cols_starting_with_a = df.filter(regex='^A')
print("Столбцы, начинающиеся с 'A':")
print(cols_starting_with_a)

Выбор не смежных столбцов

Если вам нужно выбрать столбцы, которые не находятся рядом друг с другом:

python
# Выбираем столбцы 'a' и 'c' (пропуская 'b')
ac_df = df[['a', 'c']]
print("Только столбцы 'a' и 'c':")
print(ac_df)

Заключение

Ключевые выводы

  1. Используйте двойные скобки df[['a', 'b']] для выбора нескольких столбцов и создания нового DataFrame
  2. Одинарные скобки df['a'] возвращают Series, в то время как двойные скобки возвращают DataFrame
  3. Избегайте устаревших методов, таких как ix — используйте loc для выбора на основе меток и iloc для выбора на основе позиций
  4. Строковое срезание, такое как df['a':'b'], не работает для выбора столбцов — оно предназначено для индексации строк
  5. Существует несколько альтернатив, включая loc, iloc, filter() и явное создание DataFrame

Лучшие практики

  • Всегда проверяйте существование имен столбцов перед выбором
  • Используйте двойные скобки, чтобы убедиться, что вы получаете DataFrame, а не Series
  • Предпочитайте loc устаревшим методам для выбора на основе меток
  • Сохраняйте списки столбцов в переменных при их повторном использовании для лучшей производительности

Рекомендуемый подход

Для вашего конкретного случая выбора столбцов ‘a’ и ‘b’ из DataFrame рекомендуемый подход:

python
df1 = df[['a', 'b']]

Это наиболее идиоматичный, читаемый и эффективный способ достижения вашей цели в pandas. Он создает новый DataFrame, содержащий только указанные вами столбцы, оставляя исходный DataFrame без изменений.


Источники

  1. Документация Pandas - Выбор подмножества
  2. GeeksforGeeks - Выбор нескольких столбцов в Pandas
  3. Stack Overflow - Назначение двойных скобок
  4. Towards Data Science - Выбор нескольких столбцов
  5. Statology - Pandas выбор нескольких столбцов
  6. PythonHow - Выбор нескольких столбцов
  7. Spark by Examples - Pandas выбор нескольких столбцов