2016-03-21 2 views
0

zugeordnet sind Ich habe versucht, den Kopf für eine Weile zu schließen und habe noch keine Lösung gefunden.Daten bereinigen: Aktuelle Spaltenwerte durch Werte ersetzen, die im Dictionary

Meine Frage ist, wie kann ich die aktuellen Spaltenwerte in mehreren Spalten basierend auf dem Spaltennamen ändern, wenn die Kriterien erfüllt sind ???

Ich habe Befragungsdaten, die als Pandas csv Datenrahmen eingelesen wurde:

import pandas as pd 
df = pd.read_csv("survey_data") 

ein Wörterbuch mit Spaltennamen erstellt haben, und die Werte, die ich in jeder Spalte wollen, wenn die aktuelle Spalte Wert gleich 1. Jede Spalte enthält 1 oder NaN. Grundsätzlich bleibt jede Spalte innerhalb des Datenrahmens, die auf "_SA" = 5, "_A" = 4, "_NO" = 3, "_D" = 2 und "_SD" endet, als der aktuelle Wert 1. Alle der "NaN" -Werte bleiben wie es ist. Dies ist das Wörterbuch:

op_dict = { 
'op_dog_SA':5, 
'op_dog_A':4, 
'op_dog_NO':3, 
'op_dog_D':2, 
'op_dog_SD':1, 
'op_cat_SA':5, 
'op_cat_A':4, 
'op_cat_NO':3, 
'op_cat_D':2, 
'op_cat_SD':1, 
'op_fish_SA':5, 
'op_fish_A':4, 
'op_fish_NO':3, 
'op_fish_D':2, 
'op_fish__SD':1} 

Ich habe auch eine Liste der Spalten innerhalb des Datenrahmens erstellt würde Ich mag, wenn der aktuelle Spalte Wert = 1 genannt [op_cols] geändert werden. Jetzt habe ich versucht, so etwas zu verwenden, die in diesen Spalten durch die Werte iteriert und ersetzt 1 mit dem zugeordneten Wert im Wörterbuch:

for i in df[op_cols]: 
    if i == 1: 
     df[op_cols].apply(lambda x: op_dict.get(x,x)) 

df[op_cols] 

es sprüht keinen Fehler, aber es ersetzt nicht die 1 Werte mit dem entsprechenden Wert aus dem Wörterbuch. Es bleibt als 1.

Jede Beratung/Vorschläge, warum dies nicht funktionieren würde, oder eine effizientere Art und Weise stark

Antwort

0

geschätzt So wäre, wenn ich Ihre Frage verstehen Sie alle diejenigen in einer Spalte mit 1 zu ersetzen, 2,3,4,5 abhängig vom Spaltennamen?

denke ich, alles, was Sie tun müssen, ist durch die Liste und mehr durch den Wert Ihrer dict kehrt iterieren:

for col in op_cols: 
    df[col] = df[col]*op_dict[col] 

Das tut, was Sie beschreiben, und ist weit schneller als jeden Wert zu ersetzen. NaNs werden immer noch NaNs sein, Sie können mit denen in der Schleife umgehen, wenn Sie möchten.

+0

Danke @tvashtar das hat perfekt funktioniert, ich dachte nicht, die Spaltennamen zu durchlaufen. Schätzen Sie die Hilfe dazu – da4l