2017-10-05 7 views
1

Ich versuche, eine CSV-Datei zu importieren, diese Datei hat zwei Spalten: Bachelor's und Master's. Ich möchte die Majors, die für jeden sind, einer Zeichenfolge zuordnen, die sowohl die Studentenebene (Bachelor oder Master) als auch die Hauptgruppe (z. B. Business) darstellt.Häufigkeitsverteilung - Python - Importieren von CSV

Diese CSV-Datei wird in der Form geschrieben:

Bachelor's Master's 

SBS   O 
H   O 
H   0 
H   O 

... ...

Dies aus zwei getrennten Spalten erfolgt. Ich habe den folgenden Code, den ich verwendet haben:

Major_Proper = ['Business', 'Computer Sciences and 
Engineering','Education','Humanities','Natural Sciences and 
Mathematics','Other'] 

Degree = {"Bachelor's":['B','CSE','E','H','NSM','O'],"Master's":['B','CSE','E','H','NSM','O']} 

Major = ['B','CSE','E','H','NSM','O'] 
b_b = m_b = [] 
b_cse = m_cse = [] 
b_e = m_e = [] 
b_nsm = m_nsm = [] 
b_sbs = n_nsm = [] 
b_o = m_o = [] 
bach = [] 
mast = [] 

with open('Majors.csv') as f: 
    data = f.read().replace('\n',"") 
    df = pd.read_csv('Majors.csv', header=None, names=["Bachelor's", "Master's"]) 

    for x in range(0,len(bach)): 
     if x == Major[0]: 
      b_b.append(x) 
     if x == Major[1]: 
      b_cse.append(x) 
     if x == Major[2]: 
      b_e.append(x)    
     if x == Major[3]: 
      b_nsm.append(x) 
     if x == Major[4]: 
      b_sbs.append(x) 
     if x == Major[5]: 
      b_o.append(x) 

    for x in range(0,len(mast)): 
     if x == Major[0]: 
      m_b.append(x) 
     if x == Major[1]: 
      m_cse.append(x) 
     if x == Major[2]: 
      m_e.append(x)    
     if x == Major[3]: 
      m_nsm.append(x) 
     if x == Major[4]: 
      m_sbs.append(x) 
     if x == Major[5]: 
      m_o.append(x) 

print(df) 
print(len(bach),len(mast)) 

Meine Vermutung ist aber, dass die Daten eine spucken lange Schlange aus, wie unten zu sehen:

      Bachelor's Master's 

Bachelor's Master's NaN   NaN  NaN 
SBS  O  NaN   NaN  NaN 
H   O  NaN   NaN  NaN 
      B  NaN   NaN  NaN 
      O  NaN   NaN  NaN 

...

[101 Zeilen x 2 Spalten]
Zeilen.
Wie Sie sehen können, wurden einige Werte übersprungen. Und drei andere Spalten wurden gemacht.
Ebenso sollte es nur 100 Zeilen geben, da die erste Zeile der Header war. Und die Länge von bach (Bachelor) und mast (Master) sollte sowohl 100, nicht 2 sein.

Jede Hilfe wird sehr geschätzt.

Antwort

0

Für den Anfang passiert nichts, wenn Sie die Datei als f öffnen. Ich vermute, das ist ein verkümmerter Code von einem früheren Versuch. Wenn Ihre CSV-Datei bereits die gewünschten Titel enthält, können Sie das Argument header=None, names=["Bachelor's", "Master's"] auf read_csv weglassen. Drittens, SBS fehlt in Ihren Degree-Listen.

Ich weiß nicht, was Sie in Ihren for-Schleifen tun, seit bach und mast sind beide leere Listen und nichts sollte hier ausgewertet werden.

Vielleicht können Sie erklären, was Sie von Ihrem Datenrahmen erhalten möchten?

0

Eigentlich ist es nicht ganz klar zu mir, was Sie erreichen wollen (Sie Ihren Code aufzuräumen sollte;)

Sie entfernen alle Newline-Zeichen und in der ersten Zeile (data=f.read().replace('\n',''), die eine lange Reihe zu schaffen - ich denke - gemeint ist, um leere Linien zu entfernen verwenden Sie s.th. wie x.replace('\n\n','\n') stattdessen Aber am Ende sind eigentlich nicht mit data und geht mit pd.read_csv()

Wenn Sie sich entscheiden data verwenden Sie s tun könnte... wie

data = f.read().replace('\n\n','\n') 
bach=[re.split(' ',x)[0] for x in re.split('\n',data)] 
mast=[re.split(' ',x)[1] for x in re.split('\n',data)] 

, um eine Liste von jedem der Bachelor-und Master-Spalten zu erhalten.

Auch Ihre for x in range(len(mast)): Iteration ist falsch: Sie durchlaufen eine Liste von ganzen Zahlen, zurückgegeben von range() (schauen was passiert mit print(range(5))). Was Sie tun möchten, ist for x in mast: als mast ist bereits eine Liste (gleich für bach).

Wie wäre es einfach mit if x=='B':? Sie würden diese sperrige list Major loswerden. Ich würde auch die If-Kaskade durch

if x=='B': 
    b_b.append(x) 
elif x=='CSE': 
    b_cse.append(x) 
etc... 
ersetzen