2017-10-16 1 views
2

Ich habe es geschafft, eine Antwort auf ein früheres Problem zu entwickeln, das ich hatte (hier gefunden: How can i create a ruleset to assign values to specific columns, based on searching substrings, in Pandas?).Erstellen mehrerer Spalten aus mehreren Werten von einer Funktion

Ich frage mich jedoch, ob es eine effizientere Möglichkeit gibt, dies zu tun. Ich wollte mehrere Klassifikationsspalten basierend auf Strings erstellen, nach denen ich in einer Beschreibungsspalte suche.

Derzeit meine Strategie ist unten:

android_phones = ['samsung','xperia','google'] 

iphone= ['iphone','apple'] 


def OS_rules(raw_Df): 
    val='' 

    if any(word in raw_Df['Names'].lower() for word in android_phones): 
     val='android' 
    elif any(word in raw_Df['Names'].lower() for word in iphone): 
     val='iPhone'   
    else: val = 'Handset' 

    return val 


df.loc[:,'OS_Type']=df.apply(OS_rules,axis=1) 

jedoch mit dieser Strategie, ich muß mehrere Funktionen mit ‚fast‘ identischen Regeln, aber mit unterschiedlichen Rückgabewerten erstellen.

Gibt es eine Möglichkeit, mehrere Werte von einer einzelnen Funktion zurückzugeben? Und wenden Sie diese über mehrere neue Spalten an?

z.B.

if any(word in raw_Df['Names'].lower() for word in android_phones): 
    val1='android' 
    val2='pixel' 
    val3='vodafone' 

usw. etc etc, dann neue Spalten aus diesen erstellen?

Antwort

0

Verwendung:

#create dictionary of all lists 
d = {'android':android_phones, 'iPhone':iphone} 

def OS_rules(raw_Df): 

    #loop by dictionary and return key of dict 
    for k, v in d.items(): 
     if any(word in raw_Df['Names'].lower() for word in v): 
      return k  

#if no value match get NaN, so fillna by default value 
df['OS_Type']=df.apply(OS_rules,axis=1).fillna('Handset') 
print (df) 
        Names qty OS_Type 
0  IPHONE_3UK_CONTRACT 968 iPhone 
1  IPHONE_O2_SIMONLY 155 iPhone 
2  ANDROID_3UK_PAYG 77 Handset 
3 ANDROID_VODAF_CONTRACT 973 Handset 
Verwandte Themen