Извлечение определенных выбранных столбцов в новый DataFrame в качестве копии

185

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

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator 

Как это сделать?

SpeedCoder5
источник

Ответы:

359

Есть способ сделать это, и он действительно похож на R

new = old[['A', 'C', 'D']].copy()

Здесь вы просто выбираете нужные столбцы из исходного фрейма данных и создаете переменную для них. Если вы хотите вообще изменить новый фрейм данных, вы, вероятно, захотите использовать его, .copy()чтобы избежать SettingWithCopyWarning.

Альтернативный метод заключается в использовании, filterкоторый создаст копию по умолчанию:

new = old.filter(['A','B','D'], axis=1)

Наконец, в зависимости от количества столбцов в исходном фрейме данных, это может быть более кратким, чтобы выразить это с помощью drop(это также создаст копию по умолчанию):

new = old.drop('B', axis=1)
johnchase
источник
20
Предостережение при копировании только одного столбца: old[['A']].copy()для создания нового фрейма данных требуются двойные квадратные скобки. Обратите внимание, что old['A'].copy()будет создавать только серии.
intotecho
19

Самый простой способ

new = old[['A','C','D']]

,

stidmatt
источник
3
Это не делает копию, если вы явно не вызываете .copy ()
Sylvain
это копирует по умолчанию.
Нгуай аль
2
@Nguaial поведение простого индексирования не указано. Вы не будете знать, получите ли вы копию или просмотр. Подробности смотрите в документации: pandas.pydata.org/pandas-docs/stable/user_guide/…
Оле Фасс
8

Кажется, еще один более простой способ:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

где old.column_nameдаст вам серию. Составьте список всех столбцов, которые вы хотите сохранить, и передайте его конструктору DataFrame. Нам нужно сделать транспонирование, чтобы настроить форму.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50
Ударить
источник
работает, но нет, если column_name имеет специальные символы.
Jimh
о, не думал об этом
Хит
3

Универсальная функциональная форма

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

Специально для вашей проблемы выше

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
Деслин Найду
источник
2

Если вы хотите иметь новый фрейм данных, тогда:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]
Ложь
источник
1

Насколько я могу судить, вам не обязательно указывать ось при использовании функции фильтра.

new = old.filter(['A','B','D'])

возвращает тот же кадр данных, что и

new = old.filter(['A','B','D'], axis=1)
Эллен
источник
1

столбцы по индексу:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
sailfish009
источник