2014-05-06 12 views
6

Khi chọn dữ liệu từ một khung dữ liệu Pandas, đôi khi một khung nhìn được trả về và đôi khi một bản sao được trả về. Trong khi có một logic đằng sau điều này, có cách nào để bắt Pandas để rõ ràng trả lại một chế độ xem hoặc bản sao không?Force Return của "View" thay vì sao chép trong Pandas?

+0

Bạn có thể cung cấp một mẫu của sự khác biệt giữa một cái nhìn và một bản sao? – cwharland

+0

Xem ở đây để biết các quy tắc: http://stackoverflow.com/questions/23296282/what-rules-does-pandas-use-to-generate-a-view-vs-a-copy –

+0

@cwharland, hiểu biết của tôi là sửa đổi để xem cũng sửa đổi các dataframe chính (để tham khảo), và một bản sao là ... một bản sao. – calben

Trả lời

4

Có hai phần cho câu hỏi của bạn: (1) cách thực hiện chế độ xem (xem phần dưới cùng của câu trả lời này) và (2) cách tạo bản sao.

tôi sẽ chứng minh với một số ví dụ dữ liệu:

import pandas as pd 

df = pd.DataFrame([[1,2,3],[4,5,6],[None,10,20],[7,8,9]], columns=['x','y','z']) 

# which looks like this: 
    x y z 
0 1 2 3 
1 4 5 6 
2 NaN 10 20 
3 7 8 9 

Làm thế nào để tạo một bản sao: Một lựa chọn là để sao chép một cách rõ ràng DataFrame của bạn sau khi bất cứ điều gì hoạt động bạn thực hiện. Ví dụ, cho phép nói rằng chúng ta đang chọn hàng mà không có NaN:

df2 = df[~df['x'].isnull()] 
df2 = df2.copy() 

Sau đó, nếu bạn thay đổi giá trị trong df2 bạn sẽ thấy rằng những sửa đổi không truyền lại dữ liệu gốc (df), và rằng Gấu trúc không cảnh báo rằng "Giá trị đang cố gắng được đặt trên bản sao của một lát từ khung dữ liệu"

df2['x'] *= 100 

# original data unchanged 
print(df) 

    x y z 
0 1 2 3 
1 4 5 6 
2 NaN 10 20 
3 7 8 9 

# modified data 
print(df2) 

    x y z 
0 100 2 3 
1 400 5 6 
3 700 8 9 

Lưu ý: bạn có thể thực hiện lần truy cập hiệu suất bằng cách tạo bản sao rõ ràng.

Làm cách nào để bỏ qua cảnh báo: Ngoài ra, trong một số trường hợp, bạn có thể không quan tâm xem chế độ xem hoặc sao chép có được trả lại hay không vì mục đích của bạn là sửa đổi vĩnh viễn dữ liệu và không bao giờ quay lại dữ liệu gốc. Trong trường hợp này, bạn có thể chặn cảnh báo và thực hiện một cách vui vẻ trên con đường của mình (đừng quên rằng bạn đã tắt nó đi và dữ liệu gốc có thể hoặc không bị sửa đổi bởi mã của bạn, vì df2 có thể hoặc không thể là một bản sao):

pd.options.mode.chained_assignment = None # default='warn' 

để biết thêm thông tin, xem câu trả lời tại How to deal with SettingWithCopyWarning in Pandas?

làm thế nào để làm cho một cái nhìn: Pandas sẽ ngầm bày tỏ quan điểm bất cứ nơi nào và bất cứ khi nào có thể. Chìa khóa cho điều này là sử dụng phương pháp df.loc[row_indexer,col_indexer]. Ví dụ, để nhân lên các giá trị của cột y bởi 100 cho chỉ có các hàng nơi cột x không phải là null, chúng ta sẽ viết:

mask = ~df['x'].isnull() 
df.loc[mask, 'y'] *= 100 

# original data has changed 
print(df) 

    x y z 
0 1.0 200 3 
1 4.0 500 6 
2 NaN 10 20 
3 7.0 800 9 
+1

jeffgoldblumthereitis.gif :-D – calben

+0

Câu trả lời này, bực bội, trả lời ngược lại với câu hỏi được hỏi, giống như phần còn lại của internet. -1 –

+1

Câu hỏi đặt ra là "có cách nào để bắt Pandas trả lại một cách rõ ràng một bản sao hay một bản sao?" mà tôi đã trả lời cách để tạo một bản sao một cách rõ ràng. Tôi cho rằng phần bực bội là nếu bạn muốn thay đổi một cách rõ ràng? Cũng lưu ý rằng tiêu đề câu hỏi khác với câu hỏi trong mô tả ... không có tác dụng. – MD004

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