Как выбрать несколько столбцов ‘a’ и ‘b’ из DataFrame Pandas и сохранить их в новый DataFrame?
У меня есть DataFrame со столбцами ‘a’, ‘b’ и ‘c’, и я хочу создать новый DataFrame, содержащий только столбцы ‘a’ и ‘b’.
Мои неудачные попытки:
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Какой правильный способ выбрать несколько столбцов в Pandas и создать новый DataFrame, содержащий только эти столбцы?
Чтобы выбрать несколько столбцов ‘a’ и ‘b’ из DataFrame Pandas и создать новый DataFrame, следует использовать двойные квадратные скобки со списком имен столбцов: df1 = df[['a', 'b']]. Этот метод возвращает новый DataFrame, содержащий только указанные столбцы, что отличается от одинарных скобок, которые вернут Series при выборе одного столбца.
Содержание
- Правильный метод выбора нескольких столбцов
- Альтернативные подходы
- Почему ваши попытки не увенчались успехом
- Распространенные ошибки и лучшие практики
- Практические примеры
- Расширенный выбор столбцов
Правильный метод выбора нескольких столбцов
Основной и наиболее прямой метод для выбора нескольких столбцов из DataFrame Pandas — использование двойных квадратных скобок со списком имен столбцов:
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 предоставляет выбор на основе меток и предлагает большую гибкость:
df1 = df.loc[:, ['a', 'b']]
Это явно выбирает все строки (:) и только столбцы ‘a’ и ‘b’. Согласно документации pandas, loc[] используется для выбора на основе меток и особенно полезен, когда вам нужен больший контроль над процессом выбора.
Использование iloc для выбора на основе позиций
Если вы знаете позиции ваших столбцов, а не их имена:
df1 = df.iloc[:, [0, 1]] # Выбираем первые два столбца по позиции
Явное создание нового DataFrame
Вы также можете создать новый DataFrame, передав исходный DataFrame и указав столбцы для включения:
df1 = pd.DataFrame(df, columns=['a', 'b'])
Этот метод явный и делает вашу цель ясной — создать новый DataFrame с определенными столбцами.
Использование метода filter()
Для более продвинутых шаблонов выбора столбцов:
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]]
Распространенные ошибки и лучшие практики
Одинарные против двойных скобок
Распространенный источник путаницы — разница между одинарными и двойными скобками:
# Одинарная скобка - возвращает Series (1D массив)
series_a = df['a'] # Возвращает pandas Series
# Двойные скобки - возвращает DataFrame (2D массив)
df_ab = df[['a', 'b']] # Возвращает pandas DataFrame
Как объясняется в обсуждении на Stack Overflow, “вы должны использовать двойные скобки, если выбираете два или более столбца. При выборе одного имени столбца пара одинарных скобок возвращает Series.”
Существование имен столбцов
Всегда проверяйте, что имена столбцов, которые вы пытаетесь выбрать, действительно существуют:
# Проверяем существование столбцов перед выбором
if 'a' in df.columns and 'b' in df.columns:
df1 = df[['a', 'b']]
else:
print("Один или оба столбца не существуют в DataFrame")
Вопросы производительности
Для больших DataFrame метод с двойными скобками обычно эффективен. Однако, если вам нужно выбирать столбцы многократно, рассмотрите:
# Сохраняем имена столбцов в переменной для повторного использования
cols_to_select = ['a', 'b']
df1 = df[cols_to_select]
Практические примеры
Давайте рассмотрим полный пример:
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:
# Определяем данные сотрудников
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
Расширенный выбор столбцов
Выбор столбцов на основе условий
Вы также можете выбирать столбцы на основе определенных условий:
# Выбираем столбцы, содержащие конкретный текст
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() с регулярными выражениями:
# Выбираем столбцы, начинающиеся с 'A'
cols_starting_with_a = df.filter(regex='^A')
print("Столбцы, начинающиеся с 'A':")
print(cols_starting_with_a)
Выбор не смежных столбцов
Если вам нужно выбрать столбцы, которые не находятся рядом друг с другом:
# Выбираем столбцы 'a' и 'c' (пропуская 'b')
ac_df = df[['a', 'c']]
print("Только столбцы 'a' и 'c':")
print(ac_df)
Заключение
Ключевые выводы
- Используйте двойные скобки
df[['a', 'b']]для выбора нескольких столбцов и создания нового DataFrame - Одинарные скобки
df['a']возвращают Series, в то время как двойные скобки возвращают DataFrame - Избегайте устаревших методов, таких как
ix— используйтеlocдля выбора на основе меток иilocдля выбора на основе позиций - Строковое срезание, такое как
df['a':'b'], не работает для выбора столбцов — оно предназначено для индексации строк - Существует несколько альтернатив, включая
loc,iloc,filter()и явное создание DataFrame
Лучшие практики
- Всегда проверяйте существование имен столбцов перед выбором
- Используйте двойные скобки, чтобы убедиться, что вы получаете DataFrame, а не Series
- Предпочитайте
locустаревшим методам для выбора на основе меток - Сохраняйте списки столбцов в переменных при их повторном использовании для лучшей производительности
Рекомендуемый подход
Для вашего конкретного случая выбора столбцов ‘a’ и ‘b’ из DataFrame рекомендуемый подход:
df1 = df[['a', 'b']]
Это наиболее идиоматичный, читаемый и эффективный способ достижения вашей цели в pandas. Он создает новый DataFrame, содержащий только указанные вами столбцы, оставляя исходный DataFrame без изменений.
Источники
- Документация Pandas - Выбор подмножества
- GeeksforGeeks - Выбор нескольких столбцов в Pandas
- Stack Overflow - Назначение двойных скобок
- Towards Data Science - Выбор нескольких столбцов
- Statology - Pandas выбор нескольких столбцов
- PythonHow - Выбор нескольких столбцов
- Spark by Examples - Pandas выбор нескольких столбцов