Sono passato da R a Panda. Io abitualmente ottengo SettingWithCopyWarnings, quando faccio qualcosa comeQual è il punto di vista nei panda se non è definito se un'operazione di indicizzazione restituisce una vista o una copia?
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, which may or may not return a view
df_b = df_a[df_a['col1'] > 1]
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# SettingWithCopyWarning!!
credo di aver capito il problema, anche se imparerò volentieri quello che ho ottenuto sbagliato. Nell'esempio indicato, non è definito se df_b
è una vista su df_a
oppure no. Pertanto, l'effetto dell'assegnazione a df_b
non è chiaro: ha effetto su df_a
? Il problema può essere risolto facendo in modo esplicito una copia durante il filtraggio:
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, definitely a copy now
df_b = df_a[df_a['col1'] > 1].copy()
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# No Warning now
penso che ci sia qualcosa che mi manca: se non possiamo mai essere veramente sicuri se creiamo una vista o no, che cosa sono viste buone per ? Dalla documentazione panda (http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy)
Al di fuori dei casi semplici, è molto difficile prevedere se esso [getitem] restituirà una vista o una copia (dipende dal layout di memoria della matrice, di cui panda non ha garanzie)
Avvertenze simili possono essere trovate per diversi metodi di indicizzazione.
Trovo molto ingombrante e errorprone di cospargere .copy() chiama attraverso il mio codice. Sto usando lo stile sbagliato per manipolare i miei DataFrames? O il guadagno di prestazioni è così alto da giustificare l'apparente imbarazzo?
È possibile disattivare questo nuovo avviso con la seguente assegnazione. 'pd.options.mode.chained_assignment = None' –
Hmmm, forse aiuta a ripristinare l'indice' df_b = df_a [df_a ['col1']> 1] .reset_index (drop = True) '. – jezrael
@GeorgePetrov Vorrei fortemente suggerire di disabilitare questo! L'avviso si presenta per una buona ragione: se mai, in realtà ti suggerirei di promuoverlo su un'eccezione anziché un avvertimento. –