2017-04-18 5 views
1

Ich verwende die Methode apply, um Daten an eine Funktion von einem Pandas DataFrame an eine Funktion zu senden. Wenn die Zelle leer ist, ist der Objekttyp "NoneType" oder "float", was mit den String-Vergleichen, die meine Funktion ausführt, nicht kompatibel ist. Ich bin Filterung dieser Daten aus mit:Beste Methode zum Ausfiltern leerer Dataframe-Zellen mit Pandas anwenden

if isinstance(col1,str): #to make sure the data is a string. 

Meine Frage ist, ob es einen besseren Weg, dies zu tun, da dies das Konzept der Ente eingeben geht gegen?

Für Kontext hier ist mein Code:

def check_cols(col1,col2): 
    if isinstance(col1,str): 
     var = col1 
    else: 
     var = col2 
    #the logical part of the function is here 

#passing in data from two columns 
dfcat['col3'] = dfcat.apply(lambda x: check_cols(x['col1'],x['col2']),axis=1) 

Antwort

1

Ich glaube, Sie combine_first verwenden können, wenn None und NaN ersetzen müssen:

dfcat['col3'] = dfcat['col1'].combine_first(dfcat['col2']) 

Aber wenn nicht strings Gebrauch benötigen ersetzen mask mit boolean mask:

mask = dfcat['col1'].apply(lambda x: isinstance(x,str)) 
dfcat['col3'] = dfcat['col2'].mask(mask, dfcat['col1']) 

Probe:

dfcat = pd.DataFrame({'col1':[np.nan, 'aa', None, 10, 12.7], 'col2':['e','r','t','k', 'g']}) 
print (dfcat) 
    col1 col2 
0 NaN e 
1 aa r 
2 None t 
3 10 k 
4 12.7 g 

mask = dfcat['col1'].apply(lambda x: isinstance(x,str)) 
dfcat['col3'] = dfcat['col2'].mask(mask, dfcat['col1']) 
print (dfcat) 
    col1 col2 col3 
0 NaN e e 
1 aa r aa 
2 None t t 
3 10 k k 
4 12.7 g g 
+0

Groß Beispiel sehr hilfreich! – sparrow

Verwandte Themen