2017-12-04 1 views
2

Ich habe eine df, die eine Spalte (acount_no) enthält leere Strings, Leerzeichen und wiederholte Ziffern Strings als seine Werte. Für diese Werte möchte ich eine neue Spalte anlegen (valid_account_no) und False auf die entsprechenden Zeilen setzen. Auch wenn die Länge von account_no<= 4 ist, werden sie False zu valid_account_no gesetzt. die df aussieht,Pandas setzen boolesche Werte für eine Spalte basierend auf Werten einer anderen Spalte mit regex übereinstimmen

id account_no valid_account_no 
1     False 
2  999999  False 
3  1234   False 
4  123456  True 

dies mein Code,

# sets boolean values of column valid account no when account no is spaced or repeated number 
df['valid_account_no'] = df['account_no'].str.match(r"\b(\d)\1+\b| +") 

# if length of any account nos are <= 4 or the account nos are empty 
# set values of column valid account no to False 
invalid_account_indices = df[(df['account_no'].str.len() <= 4) | 
          (df['account_no'] == '')].index 
df.loc[invalid_account_indices, 'valid_account_no'] = False 

Ich frage mich, ob es einen besseren Weg, dies zu erreichen, in einem gewissen Sinn es prägnanter und effizienter zu machen.

Antwort

2

Ihr Ansatz selbst wenn gut, eine andere Arbeit um mit einfachen boolean Algebra dh

m1 = df['account_no'].str.match(r"\b(\d)\1+\b| +") 
m2 = df['account_no'].str.len()<=4 
m3 = df['account_no'] == '' 
df['valid_account_no'] = (m1) | (m2 & m3) 
+1

einen Fehler in meinem OP gemacht, sollte 'verwenden (df [ 'account_no']. Str.len() <= 4) | (df ​​['account_no'] == '') 'anstelle von' & ' – daiyue

Verwandte Themen