2014-12-28 24 views
59

Khi chọn một khung dữ liệu phụ từ một khung dữ liệu mẹ, tôi nhận thấy rằng một số lập trình viên tạo bản sao của khung dữ liệu bằng cách sử dụng phương thức .copy().Tại sao tôi nên tạo bản sao của khung dữ liệu trong gấu trúc

Tại sao họ tạo bản sao của khung dữ liệu? Điều gì sẽ xảy ra nếu tôi không tạo một bản sao?

+2

Tôi đoán là họ đang đề phòng thêm để không sửa đổi khung dữ liệu nguồn. Có lẽ không cần thiết, nhưng khi bạn đang ném một cái gì đó với nhau một cách tương tác, an toàn hơn là xin lỗi. –

+4

Tôi cho rằng đây không phải là một câu hỏi ngu ngốc khi đưa ra một câu hỏi tiêu cực. –

Trả lời

66

Điều này mở rộng câu trả lời của Paul. Trong Pandas, việc lập chỉ mục một DataFrame trả về một tham chiếu đến DataFrame ban đầu. Do đó, việc thay đổi tập hợp con sẽ thay đổi DataFrame ban đầu. Vì vậy, bạn muốn sử dụng bản sao nếu bạn muốn đảm bảo DataFrame ban đầu không được thay đổi. Xét đoạn mã sau:

df = DataFrame({'x': [1,2]}) 
df_sub = df[0:1] 
df_sub.x = -1 
print(df) 

Bạn sẽ nhận được:

x 
0 -1 
1 2 

Ngược lại, những chiếc lá df sau không thay đổi:

df_sub_copy = df[0:1].copy() 
df_sub_copy.x = -1 
19

Bởi vì nếu bạn không tạo một bản sao sau đó các chỉ mục vẫn có thể được thao tác ở nơi khác ngay cả khi bạn gán dataFrame cho một tên khác.

Ví dụ:

df2 = df 
func1(df2) 
func2(df) 

Func1 có thể sửa đổi df bằng cách sửa đổi df2, vì vậy để tránh điều đó:

df2 = df.copy() 
func1(df2) 
func2(df) 
3

Đó là cần thiết để đề cập đến việc trở về sao chép hoặc xem phụ thuộc vào loại lập chỉ mục.

Các tài liệu gấu trúc nói:

Trở một cái nhìn so với một bản sao

Các quy tắc về việc khi nào một cái nhìn về những dữ liệu được trả về là hoàn toàn phụ thuộc vào NumPy. Bất cứ khi nào một mảng các nhãn hoặc một boolean vector có liên quan đến hoạt động lập chỉ mục, kết quả sẽ là một bản sao. Với việc lập chỉ mục nhãn/scalar đơn lẻ và cắt, ví dụ: df.ix [3: 6] hoặc df.ix [:, 'A'], chế độ xem sẽ được trả lại.

Các vấn đề liên quan