2016-07-16 12 views
2

Ich versuche, alle Datumswerte in einer Tabelle Datum Spalte ändern, wo das Jahr vor 1900 ist, bis zum heutigen Datum Ich habe eine Scheibe.Pandas: SettingWithCopyWarning, versuchen zu verstehen, wie der Code besser geschrieben wird, nicht nur, ob die Warnung ignoriert werden soll

EDIT: vorherige Codezeilen:

df=pd.read_excel(filename)#,usecols=['NAME','DATE','EMAIL'] 
#regex to remove weird characters 
df['DATE'] = df['DATE'].str.replace(r'[^a-zA-Z0-9\._/-]', '') 
df['DATE'] = pd.to_datetime(df['DATE']) 

sample row in dataframe: name, date, email 
[u'Public, Jane Q.\xa0' u'01/01/2016\xa0' u'[email protected]\xa0'] 

Diese Codezeile funktioniert.

df["DATE"][df["DATE"].dt.year < 1900] = dt.datetime.today() 

Dann werden alle Datumswerte formatiert:

df["DATE"] = df["DATE"].map(lambda x: x.strftime("%m/%d/%y")) 

Aber ich erhalte eine Fehlermeldung:

SettingWithCopyWarning: A value is trying to be set on a copy of a 
slice from a DataFrame 

See the caveats in the documentation: 
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view- 

versus-Kopie

ich die Dokumentation und andere Beiträge gelesen , wobei .loc empfohlen wird

Das Folgende ist die empfohlene Lösung:

df.loc[row_indexer,col_indexer] = value 

aber df["DATE"].loc[df["DATE"].dt.year < 1900] = dt.datetime.today() gibt mir den gleichen Fehler, mit der Ausnahme, dass die Zeilennummer ist eigentlich die Zeilennummer nach der letzten Zeile im Skript.

Ich verstehe einfach nicht, was die Dokumentation versucht, mir zu sagen, wie es sich auf mein Beispiel bezieht.

Ich fing an, herumzualbern mit dem Herausziehen der Scheibe und der Zuordnung zu einem separaten Datenrahmen, aber dann werde ich sie wieder zusammenbringen müssen.

+0

Dies sollten Sie eine gute Vorstellung davon, was los ist http://stackoverflow.com/a/38147527/2336654 – piRSquared

+1

seinen 'df.loc [df [ "DATE"]. Dt.year <1900, "DATA"] = dt.datetime.today() ' – cel

+0

Aber dieser Code setzt den Datumswert in jede Spalte im Datenrahmen für diese Zeile. Deshalb habe ich es in 'df [" DATE "] [df [" DATE "] geändert ...' – mattrweaver

Antwort

1

Sie erstellen eine Ansicht, wenn Sie und anschließend einen Selektor [df["DATE"].dt.year < 1900] verwenden und versuchen, es zuzuweisen.

df["DATE"][df["DATE"].dt.year < 1900] ist die Ansicht, über die sich Pandas beschweren.

Fix it mit loc wie folgt aus:

df.loc[df.DATE.dt.year < 1900, "DATE"] = pd.datetime.today() 
+0

Danke für Deine Antwort. Ich habe meine ursprüngliche Frage bearbeitet, um die vorherigen Codezeilen und ein Beispiel für Daten einzufügen, die eine Zeile aus der Excel-Datei sind, aus der ich arbeite. – mattrweaver

+0

Basierend auf print df.is_copy, ist es keine Kopie, das Ergebnis war None. Bedeutet das, dass ich die Warnung unterdrücken kann? – mattrweaver

+0

@mattrweaver Mein Beitrag wurde aktualisiert. – piRSquared

1

Mein Gedanke wäre, dass Sie an einem Computer

df.loc[df.DATE.dt.year < 1900, "DATE"] = dt.datetime.today() 
df.loc[:, "DATE"] = df.DATE.map(lambda x: x.strftime("%m/%d/%y") 

nicht tun konnte, so kann ich nicht testen, aber ich denke, das sollte es tun.

+0

Die zweite Zeile gibt mir" ValueError: Jahr = 1700 ist vor 1900; die datetime strftime() Methoden erfordern Jahr> = 1900 " – mattrweaver