Heim > Backend-Entwicklung > Python-Tutorial > Warum bleibt SettingWithCopyWarning bei der .loc-Indizierung bestehen?

Warum bleibt SettingWithCopyWarning bei der .loc-Indizierung bestehen?

DDD
Freigeben: 2024-10-28 08:03:02
Original
871 Leute haben es durchsucht

Why Does the SettingWithCopyWarning Persist with .loc Indexing?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage