Витяг конкретних вибраних стовпців у новий DataFrame як копія


185

У мене є панди DataFrame з 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 

Який пандасній спосіб це зробити?

Відповіді:


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)

20
Застереження, якщо просто копіювати один стовпець: У old[['A']].copy(), для створення нового кадру даних потрібні подвійні квадратні дужки. Зауважте, що old['A'].copy()буде створено лише Серію.
інтохо

19

Найпростіший спосіб

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

.


3
Копія не створюється, якщо ви прямо не зателефонуєте .copy ()
Sylvain

ця копія за замовчуванням
Nguai al

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

працює, але не, якщо ім'я колонки має спеціальні символи.
Джим

ой не думав про це
Удар

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.