faccio un sacco di analisi dei dati e sono interessati a trovare nuovi/metodi più veloci di effettuare operazioni. Non avevo mai incontrato il metodo di jezrael, quindi ero curioso di confrontarlo con il mio solito metodo (cioè sostituire con l'indicizzazione). NOTA: Questa non è una risposta alla domanda dell'OP, piuttosto è un'illustrazione dell'efficienza del metodo di jezrael. Dal momento che questa NON è una risposta, rimuoverò questo post se la gente non lo troverà utile (e dopo essere stato downvoted nell'oblio!). Lascia un commento se pensi che dovrei rimuoverlo.
Ho creato un dataframe di dimensioni moderate e ho fatto più sostituzioni utilizzando sia il metodo df.notnull(). Astype (int) che l'indicizzazione semplice (come farei normalmente in questo caso). Si scopre che quest'ultimo è più lento di circa cinque volte. Solo una fyi per chiunque lavori su larga scala.
from __future__ import division, print_function
import numpy as np
import pandas as pd
import datetime as dt
# create dataframe with randomly place NaN's
data = np.ones((1e2,1e2))
data.ravel()[np.random.choice(data.size,data.size/10,replace=False)] = np.nan
df = pd.DataFrame(data=data)
trials = np.arange(100)
d1 = dt.datetime.now()
for r in trials:
new_df = df.notnull().astype(int)
print((dt.datetime.now()-d1).total_seconds()/trials.size)
# create a dummy copy of df. I use a dummy copy here to prevent biasing the
# time trial with dataframe copies/creations within the upcoming loop
df_dummy = df.copy()
d1 = dt.datetime.now()
for r in trials:
df_dummy[df.isnull()] = 0
df_dummy[df.isnull()==False] = 1
print((dt.datetime.now()-d1).total_seconds()/trials.size)
Questo produce tempi di 0,142 se 0,685 s rispettivamente. È chiaro chi è il vincitore.
Possibile duplicato di [Come posso sostituire tutti i valori NaN con Zero in una colonna di un dataframe panda] (http://stackoverflow.com/questions/13295735/how-can-i-replace-all-the- nan-valori-con-zeri-in-una-colonna-di-un-pandas-datafra) –