2014-11-12 34 views
20

Có cách nào dễ dàng để kiểm tra xem hai khung dữ liệu là các bản sao khác nhau hoặc chế độ xem của cùng một dữ liệu cơ bản không liên quan đến thao tác không? Tôi đang cố gắng để có được một va li về khi mỗi được tạo ra, và đưa ra cách thức riêng biệt các quy tắc có vẻ là, tôi muốn một cách dễ dàng để kiểm tra.Kiểm tra xem khung dữ liệu có được sao chép hoặc xem trong Pandas

Ví dụ, tôi đã nghĩ "id (df.values)" sẽ ổn định trên quan điểm, nhưng họ dường như không thể:

câu trả lời
# Make two data frames that are views of same data. 
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'], 
     columns = ['a','b','c','d']) 
df2 = df.iloc[0:2,:] 

# Demonstrate they are views: 
df.iloc[0,0] = 99 
df2.iloc[0,0] 
Out[70]: 99 

# Now try and compare the id on values attribute 
# Different despite being views! 

id(df.values) 
Out[71]: 4753564496 

id(df2.values) 
Out[72]: 4753603728 

# And we can of course compare df and df2 
df is df2 
Out[73]: False 

khác tôi đã nhìn lên mà cố gắng để cung cấp cho quy tắc, nhưng dường như không nhất quán, và cũng không trả lời câu hỏi này như thế nào để kiểm tra:

Và tất nhiên: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

UPDATE: Comments dưới đây dường như để trả lời các câu hỏi - nhìn vào thuộc tính chứ không phải df.values.base Thuộc tính df.values thực hiện nó, cũng như tham chiếu đến df._is_copy thuộc tính (mặc dù sau này có thể là hình thức rất xấu vì nó là một nội bộ).

+1

Hmmm, 'df2._is_view' trả về' Đúng' nhưng được cho là được đánh dấu là riêng tư/nội bộ, có thể có cách tốt hơn để thực hiện. – Marius

+1

Đối với trường hợp của bạn, bạn có thể sử dụng: 'df2.values.base là df.values.base' – HYRY

+0

Nói chung làm' 'df.values'' sẽ tạo một bản sao, trừ khi một dtype đơn (từ tính toán đắt tiền) . Tại sao bạn quan tâm nếu một cái nhìn của nó và bạn đang thực sự cố gắng làm gì? – Jeff

Trả lời

12

Câu trả lời từ HYRY và Marius trong nhận xét!

Người ta có thể kiểm tra bằng cách:

  • thử nghiệm tương đương của các thuộc tính values.base chứ không phải là values thuộc tính, như trong:

    df.values.base is df2.values.base thay vì df.values is df2.values.

  • hoặc sử dụng thuộc tính (phải thừa nhận) _is_view (df2._is_viewTrue).

Cảm ơn mọi người!

+1

Nếu mối quan hệ được lồng nhau thì sao? Điều này vẫn hoạt động chính xác? Đó là, nếu DF1 có lẽ là một cái nhìn có thể là một bản sao của DF2; và DF2 có lẽ một cái nhìn có thể là một bản sao của DF3? – max

+0

Điều gì về 'id's'? –

0

Bạn có thể theo dõi bộ nhớ môi trường pandas/python của bạn đang tiêu thụ và giả định rằng một bản sao sẽ sử dụng nhiều bộ nhớ hơn chế độ xem, có thể quyết định theo cách này hay cách khác.

Tôi tin rằng có các thư viện ở đó sẽ trình bày việc sử dụng bộ nhớ trong chính môi trường python - ví dụ: Heapy/Guppy.

Có phải là số liệu bạn có thể áp dụng để chụp ảnh cơ sở về mức sử dụng bộ nhớ trước khi tạo đối tượng đang được kiểm tra, sau đó một hình ảnh khác sau đó. So sánh hai bản đồ bộ nhớ (giả sử không có gì khác đã được tạo ra và chúng ta có thể cô lập sự thay đổi là do đối tượng mới) nên cung cấp một ý tưởng về việc xem hoặc sao chép đã được tạo ra chưa.

Chúng tôi cần có ý tưởng về các cấu hình bộ nhớ khác nhau của từng loại triển khai, nhưng một số thử nghiệm sẽ mang lại kết quả.

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