2017-07-12 3 views
0

Ich habe einen Datenrahmen wie folgt aus:np.where in Pandas, für leere Listen Überprüfung

df = pd.DataFrame({'var1':['a','b','c'], 
        'var2':[[],[1,2,3],[2,3,4]]}) 

Ich möchte eine dritte Spalte erstellen, die den Wert in var1 gibt, wenn die entsprechende Liste in var2 leer ist, und andernfalls das erste Element der Liste in var2. Also mein beabsichtigtes Ergebnis ist:

target = pd.DataFrame({'var1':['a','b','c'], 
         'var2':[[],[1,2,3],[2,3,4]], 
         'var3':['a',1,2]}) 

Ich habe versucht, mit np.where wie folgt aus:

df['var3'] = np.where(len(df['var2'])>0 , df['var2'][0], df['var1']) 

Aber es scheint, die Länge der gesamten Spalte werden Überprüfung anstatt die Länge der Liste innerhalb jeder Zeile der Spalte. Wie kann ich die Bedingung auf jede Zeile anwenden?

Ich habe das gleiche Problem, wenn ich bool (df ['var2']) als meine Bedingung verwende.

Antwort

1

wir .str Accessoren verwenden und len:

df['var'] = np.where(df.var2.str.len() > 0, df.var2.str[0], df.var1) 

Ausgang:

var1  var2 var 
0 a   [] a 
1 b [1, 2, 3] 1 
2 c [2, 3, 4] 2 
1

Sie eine Liste Verständnis verwenden:

v3 = [row['var1'] if len(row['var2'])==0 else row['var2'][0] 
     for i, row in df.iterrows()] 
df['var3']=v3 

Alternativ können Sie statt anwenden verwenden wo, um es auf den gesamten Datenrahmen anzuwenden:

Zuerst Sie eine Funktion benötigen in

def f(row): 
    if len(row['var2'])==0: 
     return row['var1'] 
    else: 
     return row['var2'][0] 

Dann, es zu benutzen gelten gelten:

df['var3']= df.apply(f,axis=1) 
Verwandte Themen