2016-10-15 2 views
1

Ich versuche Folgendes:Bearbeiten eines Werts in einem Datenrahmen

Importieren Sie eine CSV-Datei mit UPC-Codes in einen Datenrahmen. Wenn der UPC-Code 11 Zeichen enthält, fügen Sie ihm '0' hinzu. Ex: 19962123818 -> 019962123818

Dies ist der Code:

#check UPC code length. If 11 characters, adds '0' before. If < 11 or > 13, throws Error 
for index, row in clean_data.iterrows(): 
    if len(row['UPC']) == 11: 
     row['UPC'] = ('0' + row['UPC']) 
     #clean_data.set_value(row, 'UPC',('0' + (row['UPC'])) 
     print ("Edited UPC:", row['UPC'], type(row['UPC'])) 
    if len(row['UPC']) < 11 or len(row['UPC']) > 13: 
     print ('Error, UPC length < 11 or > 13:') 
     print ("Error in UPC:", row['UPC']) 
     quit() 

Allerdings, wenn ich die Daten zu drucken, wird der ursprüngliche Wert nicht bearbeitet:

enter image description here

Weiß jemand, Was verursacht dieses Problem?

Ich versuchte die set_value-Methode wie in anderen Posts erwähnt, aber es hat nicht funktioniert.

Danke!


Danke für den vektorisierten Ansatz, viel sauberer! Allerdings bekomme ich folgende Fehler, und der Wert wird die Aktualisierung noch nicht:

enter image description here

+0

Was ist Ihre Pandas Version? –

+0

Es ist Version 0.18.1 –

+0

Tut mir leid, in der Tat schlägt die Fehlermeldung die Korrektur vor, nämlich '.loc [UPC_11_char, 'UPC']' zu verwenden, obwohl Ihre '.ix' genauso gut funktioniert. –

Antwort

4

Kann ich eine andere Methode vorschlagen?

#identify the strings shorter than 11 characters 
fix_indx = clean_data.UPC.astype(str).str.len()<11 

#append these strings with a '0' 
clean_data.loc[fix_indx] = '0'+clean_data[fix_indx].astype(str) 

die anderen zu beheben, können Sie in ähnlicher Weise tun:

bad_length_indx = clean_data.UPC.astype(str).str.len()>13 
clean_data.loc[bad_length] = np.nan 
1

Nach iterrows Dokumentation:

  1. Sie sollten nie ändern etwas, über das du iterierst. Dies funktioniert nicht garantiert in allen Fällen. Abhängig von den Daten Typen gibt der Iterator eine Kopie und keine Ansicht zurück, und das Schreiben auf hat keine Auswirkung.

row['UPC'] = ('0' + row['UPC']) modifiziert geräuschlos eine Kopie der Zeile und clean_data unmodifiziert gehalten.

Nehmen Sie einen vektorisierten Ansatz Ihres Algorithmus wie @Gene vorschlägt.

0

Ich habe es endlich behoben. Nochmals vielen Dank für die vektorisierte Idee. Wenn jemand dieses Problem in der Zukunft hat, hier ist der Code, den ich verwendet habe. Siehe auch this post für weitere Informationen.

UPC_11_char = clean_data.UPC.astype(str).str.len() == 11 
clean_data.ix[UPC_11_char, 'UPC'] = '0' + clean_data[UPC_11_char]['UPC'].astype(str) 

print clean_data[UPC_11_char]['UPC'] 
Verwandte Themen