2016-05-28 8 views
1

Ich habe eine sehr große Kerbkartendaten [200k Aufzeichnungen] und tatsächliche Studentendaten [~ 100M]. Ich versuche, Kartenfunktion zu verwenden, um einen diskreten Wert in dem Dataset in einem numerischen Wert zu konvertieren.Elegante Weise, Karte für eine wertende diskrete Variable zu verwenden

Ich konvertiere das Ergebnis in dict-Objekt, um dies zu erreichen. Gibt es einen besseren Weg, um die gleiche ohne Umwandlung der Score-Karte dict oder irgendein anderes Objekt

#Score card Data 
import pandas as pd 
raw_data = {'math_grade': ['A', 'B','MISS'], 
     'score': [1, 2, 3]} 
df_math_grade = pd.DataFrame(raw_data, columns = ['math_grade', 'score']) 

#Convert Score card to dictionary 
di = df_math_grade.set_index('math_grade')['score'].to_dict() 

#STUDENT MARKS DATA 
student_marks = { 
     'STUDENT_ID': ['S1', 'S2', 'S3','S4','S5'], 
     'MATH_GRADE': ['A','B','C','X','MISS']} 
student_marks = pd.DataFrame(student_marks, columns = ['STUDENT_ID', 'MATH_GRADE']) 

student_marks["MATH_GRADE_SCORE"] = student_marks["MATH_GRADE"].map(di) 

student_marks 

Antwort

0

Ich denke, erreichen Sie merge mit drop verwenden:

print (pd.merge(student_marks, 
       df_math_grade, 
       left_on='MATH_GRADE', 
       right_on='math_grade', 
       how='left').drop('math_grade', axis=1)) 

    STUDENT_ID MATH_GRADE score 
0   S1   A 1.0 
1   S2   B 2.0 
2   S3   C NaN 
3   S4   X NaN 
4   S5  MISS 3.0    

EDIT:

Ein anderer Lösung ist map durch Series, nur weglassen to_dict:

s = df_math_grade.set_index('math_grade')['score'] 
print (s) 
math_grade 
A  1 
B  2 
MISS 3 
Name: score, dtype: int64 

student_marks["MATH_GRADE_SCORE"] = student_marks["MATH_GRADE"].map(di) 
student_marks["MATH_GRADE_SCORE1"] = student_marks.MATH_GRADE.map(s) 
print (student_marks) 
    STUDENT_ID MATH_GRADE MATH_GRADE_SCORE MATH_GRADE_SCORE1 
0   S1   A    1.0    1.0 
1   S2   B    2.0    2.0 
2   S3   C    NaN    NaN 
3   S4   X    NaN    NaN 
4   S5  MISS    3.0    3.0 
+0

Eigentlich möchte ich dies über mehrere Spalten mit einer einfachen Funktion, so dass ich vermeiden verbinde und ich möchte es minimal sein. Meine Frage ist -kann ich Kartenfunktion mit Datenrahmen anstelle von dict verwenden? – pmv

+0

Ich denke, durch 'dict' in einer der sehr schönen Lösungen neu zuordnen, ich füge Karte von 'Serie' hinzu, überprüfen Sie bitte meine Antwort. – jezrael

+0

Wenn meine Antwort hilfreich war, nicht vergessen [akzeptieren] (http://meta.stackexchange.com/a/5235/295067) Danke. – jezrael

Verwandte Themen