SettingWithCopyWarning bleibt bei .loc-Indizierung bestehen
Bei Verwendung von .loc[row_indexer,col_indexer] = value für die Datenmanipulation kann es immer noch vorkommen, dass das Problem auftritt SettingWithCopyWarning. Dies wird normalerweise dadurch verursacht, dass der zugrunde liegende Datenrahmen kopiert wird, bevor Änderungen angewendet werden.
Schritt-für-Schritt-Fehlerreproduktion
Bedenken Sie den folgenden Datenrahmen-DF:
<code class="python">import pandas as pd d = {'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]} df = pd.DataFrame(data=d)</code>
Zunächst löst das Ändern einer Spalte mit .loc keine Warnungen aus:
<code class="python">df['new_column'] = None df.loc[0, 'new_column'] = 100</code>
Wenn df jedoch gefiltert wird, um einen neuen Datenrahmen new_df zu erstellen, können nachfolgende Änderungen mit .loc zu der Warnung führen:
<code class="python">new_df = df.loc[df.col1 > 2] new_df.loc[2, 'new_column'] = 100</code>
Dies geschieht, weil new_df eine Ansicht oder ein Segment von df ist und auf new_df angewendete Änderungen nicht zurück an df weitergegeben werden.
Lösung
Um die Warnung zu beseitigen, muss vor der Anwendung des Filters eine Kopie von df erstellt werden:
<code class="python">new_df_copy = df.loc[df.col1 > 2].copy() new_df_copy.loc[2, 'new_column'] = 100</code>
Durch die Verwendung von .copy() wird ein neuer Datenrahmen erstellt, der unabhängig von df ist und Änderungen zulässt zu new_df_copy, ohne df zu ändern.
Vermeidung für „convert_objects“
Die SettingWithCopyWarning kann auch durch die Funktion „convert_objects“ ausgelöst werden. Um dies zu vermeiden, verwenden Sie .astype(str) vor dem Aufruf von Convert_objects:
<code class="python">value1['Total Population'] = value1['Total Population'].astype(str).convert_objects(convert_numeric=True)</code>
Das obige ist der detaillierte Inhalt vonWarum bleibt SettingWithCopyWarning bei der .loc-Indizierung bestehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!