2016-07-01 10 views
4

ich delete einige Spalte versuchen und einen Wert in der Spalte mitAktion mit Pandas SettingWithCopyWarning

df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True) 
df2['date'] = df2['date'].map(lambda x: str(x)[1:]) 
df2['date'] = df2['date'].str.replace(':', ' ', 1) 
df2['date'] = pd.to_datetime(df2['date']) 

und all diese Zeichenfolge zu konvertieren bekomme ich

df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True) 
C:/Users/����� �����������/Desktop/projects/youtube_log/filter.py:11: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

Was Problem gibt es?

+0

Wie haben Sie 'df2' erstellt? Wenn Sie etwas wie "df2 = df1" eingegeben haben, kommt dieser Fehler von der Tatsache, dass "df2" eine Scheibe von 'df1' ist und nicht ein ganzes Objekt. Versuchen Sie 'df2 = df1.copy()' – ysearka

+0

@ysearka 'df2 = df [df.id == 30013]' – ldevyataykina

Antwort

9

Ihr df2 ist ein Stück eines anderen Datenrahmens. Sie müssen kopieren Sie es explizit mit df2 = df2.copy() kurz vor Ihrem Versuch zu drop

Betrachten Sie die folgende Datenrahmen:

import pandas as pd 
import numpy as np 


df1 = pd.DataFrame(np.arange(20).reshape(4, 5), list('abcd'), list('ABCDE')) 

df1 

enter image description here

Lassen Sie mich ein Stück df1-df2 zuordnen

df2 = df1[['A', 'C']] 

enter image description here

df2 ist jetzt ein Stück df1 und sollte diese nervtötenden SettingWithCopyWarning 's auslösen, wenn wir versuchen, Dinge in df2 zu ändern. Lass uns einen Blick darauf werfen.

df2.drop('c') 

enter image description here

Keine Probleme. Wie wäre es:

df2.drop('c', inplace=True) 

Es gibt es:

enter image description here

Das Problem ist, dass Pandas effizient zu sein versucht und verfolgt, dass df2 auf die gleichen Daten wie df1 zeigt. Es bewahrt diese Beziehung. Die Warnung sagt Ihnen, dass Sie nicht versuchen sollten, sich mit dem ursprünglichen Datenrahmen über den Slice zu befassen.

Beachten Sie, dass die Zeile "c" gelöscht wurde, wenn wir df2 betrachten.

df2 

enter image description here

und Blick auf df1 sehen wir, dass Zeile 'c' ist immer noch da.

df1 

enter image description here

pandas gemacht Kopie df2 dann row 'c' fallen gelassen. Dies ist möglicherweise nicht konsistent mit dem, was unsere Absicht in Betracht gezogen haben könnte. Wir haben df2 ein Stück davon gemacht und zeigen auf dieselben Daten wie df1. Pandas warnen uns.

Um die Warnung nicht zu sehen, erstellen Sie die Kopie selbst.

df2 = df2.copy() 
# or 
df2 = df1[['A', 'C']].copy() 
+1

Vielen Dank für die gute Erklärung! – ldevyataykina

+1

Wenn Sie keine Kopie erstellen und die Nachricht trotzdem entfernen möchten, können Sie sie einrichten: pd.options.mode.chained_assignment = None – Gabriel