Trích xuất các cột được chọn cụ thể vào DataFrame mới dưới dạng bản sao


184

Tôi có một DataFrame gấu trúc với 4 cột và tôi muốn tạo một DataFrame mới chỉ có ba trong số các cột. Câu hỏi này tương tự như: Trích xuất các cột cụ thể từ khung dữ liệu nhưng đối với gấu trúc không phải R. Đoạn mã sau không hoạt động, gây ra lỗi và chắc chắn không phải là cách để làm điều đó.

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 

Cách pandasnic để làm điều đó là gì?

Câu trả lời:


358

Có một cách để làm điều này và nó thực sự trông giống với R

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

Ở đây bạn chỉ cần chọn các cột bạn muốn từ khung dữ liệu ban đầu và tạo một biến cho những cột đó. Nếu bạn muốn sửa đổi khung dữ liệu mới, có lẽ bạn sẽ muốn sử dụng .copy()để tránh a SettingWithCopyWarning.

Một phương pháp thay thế là sử dụng filtersẽ tạo một bản sao theo mặc định:

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

Cuối cùng, tùy thuộc vào số lượng cột trong khung dữ liệu ban đầu của bạn, có thể ngắn gọn hơn để thể hiện điều này bằng cách sử dụng drop(điều này cũng sẽ tạo một bản sao theo mặc định):

new = old.drop('B', axis=1)

20
Lưu ý nếu chỉ sao chép một cột: Trong old[['A']].copy(), dấu ngoặc vuông được yêu cầu để tạo khung dữ liệu mới. Lưu ý rằng old['A'].copy()sẽ chỉ tạo ra một Series.
intotecho

19

Cách dễ nhất là

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

.


3
Đây không phải là một bản sao trừ khi bạn gọi rõ ràng .copy ()
Sylvain

bản sao này theo mặc định.
Nguai al

1
@Nguaial hành vi lập chỉ mục đơn giản không được chỉ định. Bạn sẽ không biết nếu bạn nhận được một bản sao hoặc một cái nhìn. Xem tài liệu để biết thêm chi tiết: pandas.pydata.org/pandas-docs/urdy/user_guide/ mẹo
Ole Fass

8

Một cách đơn giản hơn có vẻ là:

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

nơi old.column_namesẽ cung cấp cho bạn một loạt. Tạo một danh sách tất cả các chuỗi cột bạn muốn giữ lại và chuyển nó đến hàm tạo DataFrame. Chúng ta cần thực hiện một chuyển vị để điều chỉnh hình dạng.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

hoạt động, nhưng không nếu cột_name có ký tự đặc biệt.
jimh

oh đã không nghĩ về điều đó
Lượt

3

Hình thức chức năng chung

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

Cụ thể cho vấn đề của bạn ở trên

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

Nếu bạn muốn có một khung dữ liệu mới thì:

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

Theo như tôi có thể nói, bạn không nhất thiết phải chỉ định trục khi sử dụng chức năng lọc.

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

trả về cùng một khung dữ liệu như

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

1

cột theo chỉ mục:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.