2014-05-06 4 views
6

Beim Auswählen von Daten aus einem Pandas-Datenframe wird manchmal eine Ansicht zurückgegeben, und manchmal wird eine Kopie zurückgegeben. Während es eine Logik dahinter gibt, gibt es eine Möglichkeit, Pandas zu zwingen, explizit eine Ansicht oder eine Kopie zurückgeben?Force Rückkehr von "View" statt in Pandas kopieren?

+0

Können Sie eine Probe aus der Differenz zwischen dem Ziel und eine Kopie? – cwharland

+0

Siehe hier für die Regeln: http://StackOverflow.com/Questions/23296282/What-Rules-Does-Pandas-use-To-Generate-Aview-VS-Audio –

+0

@cwharland, mein Verständnis ist Modifikationen In einer Ansicht ändern Sie auch den primären Datenrahmen (also eine Referenz), und eine Kopie ist ... eine Kopie. – calben

Antwort

4

Es gibt zwei Teile auf Ihre Frage: (1), wie eine Ansicht zu machen (unten auf dieser Antwort sehen), und (2), wie eine Kopie zu machen.

Ich werde mit einigen Beispieldaten zeigen:

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 

Wie eine Kopie zu erstellen: Eine Möglichkeit ist, Ihren Datenrahmen explizit zu kopieren, nachdem unabhängig von Operationen, die Sie ausführen. Zum Beispiel können, sagen wir Zeilen auswählen, die nicht NaN haben:

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

Dann, wenn Sie Werte ändern in dF2 werden Sie feststellen, dass die Änderungen propagieren nicht wieder auf die ursprünglichen Daten (df), und dass Pandas warnt nicht, dass

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 

Note „ein Wert auf einer Kopie von einer Scheibe aus einem Datenrahmen zu setzen versucht“: Sie haben eine Leistung von explizit eine Kopie traf in Anspruch nehmen.

Wie Warnungen ignorieren: Alternativ kann in einigen Fällen könnten Sie nicht egal, ob eine Ansicht oder Kopie zurückgegeben wird, weil Ihre Absicht, dauerhaft ist, um die Daten zu ändern und nie auf die Originaldaten zurückgehen. In diesem Fall können Sie die Warnung unterdrücken und auf Ihrem Weg fröhlich weitergehen (vergessen Sie nicht, dass Sie sie ausgeschaltet haben und dass die Originaldaten möglicherweise von Ihrem Code geändert werden oder nicht, da df2 dies kann oder auch nicht) sein eine Kopie):

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

weitere Informationen finden Sie die Antworten auf How to deal with SettingWithCopyWarning in Pandas?

Wie man einen Blick machen: Pandas wird implizit Ansichten machen, wo immer und wann immer möglich. Der Schlüssel dazu ist die Verwendung der df.loc[row_indexer,col_indexer] Methode. Zum Beispiel die Werte der Spalte y 100 für nur die Zeilen zu multiplizieren, wo Spalte x nicht null ist, würden wir schreiben:

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

Diese Antwort, frustrierend, beantwortet das Gegenteil der gestellten Frage, genau wie der Rest des Internets. -1 –

+1

Die Frage war "Gibt es eine Möglichkeit, Pandas zu zwingen, eine Ansicht oder eine Kopie explizit zurückzugeben?" auf die ich antwortete, wie man explizit eine Kopie macht. Ich nehme an, der frustrierende Teil ist, wenn Sie explizit eine Ansicht wünschen? Beachten Sie auch, dass der Fragetitel von der Frage in der Beschreibung abweicht ... was nicht hilft. – MD004

Verwandte Themen