2014-05-06 30 views
6

Podczas wybierania danych z ramki danych Pandy, czasami widok jest zwracany, a czasami zwracana jest kopia. Podczas gdy istnieje logika, czy istnieje sposób na wymuszenie Pandy na jawnie zwrócenie widoku lub kopii?Wymuszenie zwrotu "Widok" zamiast kopiowania w Pandach?

+0

można dostarczyć próbkę różnicy między myślą a kopia? – cwharland

+0

Zobacz tutaj: http://stackoverflow.com/questions/23296282/what-rules-does-pandas-use-to-generate-a-view-vs-a-kopia –

+0

@cwharland, moim zrozumieniem są modyfikacje do widoku modyfikuje również podstawową ramkę danych (tak więc odniesienie), a kopia jest ... kopią. – calben

Odpowiedz

4

Masz dwie części pytania: (1) jak zrobić widok (patrz dół tej odpowiedzi) i (2) jak zrobić kopię.

będę wykazywać niektóre przykładowe dane:

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 

Jak wykonać kopię: Jedną z opcji jest wyraźnie skopiować DataFrame po dowolnych operacji wykonywanych. Na przykład, powiedzmy, że mamy do wyboru wierszy, które nie mają NaN:

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

Następnie, jeśli zmodyfikować wartości w df2 można zauważyć, że modyfikacje nie propagują powrót do oryginalnych danych (DF), i że pandy nie ostrzega, że ​​„wartość próbuje być ustawiony na kopię wycinka ze DataFrame”

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 

Uwaga: można podjąć działania hit jawnie wykonywania kopii.

Jak ignorować ostrzeżenia: Alternatywnie, w niektórych przypadkach może nie obchodzi, czy jest zwracany w widoku lub kopiowaniem, ponieważ intencją jest stale modyfikować dane i nigdy nie wrócić do oryginalnych danych. W takim przypadku możesz wyłączyć ostrzeżenie i iść wesoło (po prostu nie zapominaj, że je wyłączyłeś i że oryginalne dane mogą zostać zmodyfikowane przez Twój kod, ponieważ df2 może, ale nie musi, być kopią):

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

aby uzyskać więcej informacji, zobacz odpowiedź na How to deal with SettingWithCopyWarning in Pandas?

Jak zrobić widok: Pandy będzie niejawnie dokonywania widoki gdziekolwiek i kiedykolwiek możliwe. Kluczem do tego jest użycie metody df.loc[row_indexer,col_indexer]. Na przykład, aby pomnożyć wartości kolumny y przez 100 tylko wiersze, gdzie kolumna x nie jest NULL, to piszemy:

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

Ta odpowiedź, frustrująco, odpowiada na przeciwieństwo zadanego pytania, tak jak reszta internetu. -1 –

+1

Pytanie brzmiało: "czy istnieje sposób zmuszenia Pand do wyraźnego zwrócenia widoku lub kopii?" na które odpowiedziałem, jak jawnie zrobić kopię. Przypuszczam, że frustrujące jest to, że zamiast tego wyraźnie chciałeś widoku? Należy również pamiętać, że tytuł pytania różni się od pytania w opisie ... co nie pomaga. – MD004

Powiązane problemy