2017-07-18 2 views
1

Ich bin neu bei Pandas und Numpy. Ich habe einen Datenrahmen, mit dem ich eine neue Spalte erstellen möchte, indem ich eine Funktion für jede Zeile einer Spalte anwende. Lassen Sie uns ein vereinfachtes Beispiel nehmen:Wenden Sie eine zweite Funktion an, wenn die erste fehlschlägt

import pandas as pd 
import numpy as np 

df = pd.DataFrame(columns=["names"], data=["Brussels", 2, "New York"]) 

def to_lower(value): 
    try: 
     return value.lower() 
    except AttributeError: 
     return None 

def to_string(value): 
    return str(value) 

df['lower_names'] = np.vectorize(to_lower)(df['names']) 

Dieser Vorgang funktioniert sehr gut. Jetzt möchte ich die to_string() dann die to_lower() nur für die Zeilen von "lower_names" anwenden, wo das Ergebnis None ist (ich weiß nicht, ob das sehr klar ist).

Dies scheint sehr einfach, und dennoch habe ich Probleme. Ich konnte meine Versuche genau beschreiben, aber ich habe Angst, ein Idiot zu sein ... Vielleicht sollte ich mir diese zwei Module erst ein oder zwei Wochen lang aneignen, bevor ich mit ihnen herumspiele, aber in der Zwischenzeit wäre jeder Vorschlag willkommen.

Edit: die @jezrael Lösung ist korrekt ... für mein vereinfachtes Beispiel. Jetzt stellen wir uns vor, dass ich die np.vectorize(to_string) Funktion und dann np.vectorize(to_lower) nur auf die Zeilen der Spalte "names" anwenden möchte, wo das erste Ergebnis None ist, was wäre der beste Weg, es zu tun?

Antwort

2

Ich glaube, Sie return None ändern müssen return to_string(value):

def to_lower(value): 
    try: 
     return value.lower() 
    except AttributeError: 
     return to_string(value) 

def to_string(value): 
    return str(value) 

df['lower_names'] = np.vectorize(to_lower)(df['names']) 


print (df['lower_names'].apply(type)) 
0 <class 'str'> 
1 <class 'str'> 
2 <class 'str'> 
Name: lower_names, dtype: object 

auch möglich, astype für convert ist alle Werte auf str und dann str.lower:

df['lower_names'] = df['names'].astype(str).str.lower() 
+0

Danke, @jezrael, war, dass ein Teil meiner Versuche. Es funktioniert sehr gut auf meinem vereinfachten Beispiel, aber nicht auf meinen tatsächlichen Daten und ich weiß nicht warum ... Inzwischen hilft mir die Vereinfachung des Problems, es auf SO zu veröffentlichen, viel, um meine eigene Reflexion zu klären. –

+1

@EttororeRizza - ich glaube schon. Versuchen Sie etwas zu debuggen oder versuchen Sie mehr zu erklären, was das Problem ist. – jezrael

+0

Sie haben Recht, natürlich habe ich eine falsche Frage gestellt, indem ich es zu sehr vereinfacht habe. Ich werde es bearbeiten und Ihre Antwort akzeptieren, wenn keine andere genauer auf das Problem antwortet, das ich falsch definiert habe. –

Verwandte Themen