Czy istnieje prosty sposób sprawdzenia, czy dwie ramki danych są różnymi kopiami lub widokami tych samych podstawowych danych, które nie wymagają manipulacji? Próbuję się opanować, kiedy każdy jest generowany, i biorąc pod uwagę, jak dziwaczne wydają się te reguły, chciałbym w łatwy sposób przetestować.Sprawdzanie, czy ramka danych jest kopiowana lub wyświetlana w Pandach
Na przykład, pomyślałem „ID (df.values)” będzie stabilny w poprzek poglądów, ale nie wydają się być:
# 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
Inne odpowiedzi Przyjrzeliśmy się, że staram się dać zasady, ale nie wydaje się spójna, a także nie odpowiedzieć na to pytanie, w jaki sposób badania:
I oczywiście: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy
UPDATE: poniżej Komentarze wydają się odpowiedzieć na pytanie - Patrząc na atrybucie df.values.base
zamiast Atrybut ten ma atrybut df.values
, podobnie jak odniesienie do df._is_copy
atrybut (choć ten drugi jest prawdopodobnie bardzo złą formą, ponieważ jest wewnętrzna).
Hmmm, 'df2._is_view' zwraca' True', ale biorąc pod uwagę, że jest oznaczony jako prywatny/wewnętrzny, może istnieć lepszy sposób na zrobienie tego. – Marius
Dla twojej sprawy, możesz użyć: 'df2.values.base to df.values.base' – HYRY
Ogólnie rzecz biorąc,' df.values'' utworzy kopię, chyba że jest to pojedynczy typ dtype (jak z powodu kosztownego obliczeniowo) . Dlaczego obchodzi Cię, czy jest to widok i co tak naprawdę próbujesz zrobić? – Jeff