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

Warum bleibt SettingWithCopyWarning bei der .loc-Indizierung bestehen?

DDD
DDDOriginal
2024-10-28 08:03:02784Durchsuche

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>

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!

Stellungnahme:
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