2016-04-13 3 views
1

Für mein Projekt lese ich in einer CSV-Datei mit Daten aus jedem Staat in den USA. Meine Funktion konvertiert jedes von diesen in einen separaten Datenrahmen, da ich Operationen für die Informationen jedes Staates ausführen muss.Wie kann ich mehrere Datenrahmen durchlaufen, um in python jeweils eine Spalte auszuwählen?

def RanktoDF(csvFile): 
    df = pd.read_csv(csvFile) 
    df = df[pd.notnull(df['Index'])] # drop all null values 
    df = df[df.Index != 'Index'] #Drop all extra headers 
    df= df.set_index('State') #Set State as index 
    return df 

Ich wende diese Funktion zu jedem meiner Dateien und gibt die df mit einem Namen aus meinem Array VarNames

for name , s in zip (glob.glob('*.csv'), varNames): 
    vars()["Crime" + s] = RanktoDF(name) 

All das perfekt funktioniert. Mein Problem ist, dass ich auch einen Dataframe erstellen möchte, der aus einer Spalte von jedem dieser State Dataframes besteht.

Ich habe versucht, durch eine Liste meiner Datenrahmen iterieren und die Auswahl der Spalte (Bevölkerung) Ich möchte an einen neuen Datenrahmen anzufügen:

dfList

dfNewIndex = pd.DataFrame(index=CrimeRank_1980_df.index) # Create new DF with Index 


for name in dfList: #dfList is my list of dataframes. See image 
    newIndex = name['Population'] 
    dfNewIndex.append(newIndex) 

    #dfNewIndex = pd.concat([dfNewIndex, dfList[name['Population']], axis=1) 

Mein Fehler ist immer gleich der sagt mir, wird dieser Name als String und nicht als eine tatsächliche Datenrahmen

TypeError         Traceback (most recent call last) 
<ipython-input-30-5aa85b0174df> in <module>() 
     3 
     4 for name in dfList: 
----> 5  newIndex = name['Index'] 
     6  dfNewIndex.append(newIndex) 
     7 #  dfNewIndex = pd.concat([dfNewIndex, dfList[name['Population']], axis=1) 

TypeError: string indices must be integers 

ich verstehe gesehen, dass meine Liste eine Liste von Strings ist eher th eine Variablen/Datenframes, also meine Frage ist, wie kann ich meinen Code korrigieren, um zu tun, was ich will, oder gibt es einen einfacheren Weg, dies zu tun?

Alle Lösungen, die ich nachgeschlagen habe, haben Antworten gegeben, wo die Datenfelder explizit eingegeben werden, um verkettet zu werden, aber ich habe 50, also ist es ein wenig undurchführbar. Jede Hilfe wäre willkommen.

+0

Sind Sie sicher, dass die Objekte in dfList vom Typ Dataframe sind? weil es scheint nur die Namen der besagten Datenframes zu sein und dann macht der Fehler Sinn. – Aquiles

+0

Sind Sie sicher, dass diese Zeile wie erwartet funktioniert: 'df = df [df.Index! = 'Index'] #Drop alle zusätzlichen Header' – Alexander

+0

@Alexander Yea es tut. Es ist eine Eigenheit meiner CSV-Datei, dass es eine Verschmelzung von 3 aufeinander gestapelten Tabellen ist. Sie haben die gleichen Header, so dass durch Entfernen von "Index" aus der Index-Spalte entfernen Sie alle anderen Header und bin nur mit dem ersten verlassen . Danke für Ihre Antwort – DaithiOK

Antwort

3

Ein Weg wäre, in vars() zu indizieren, z.

Alternativ denke ich, es wäre besser, Ihre Datenframes in einem Container zu speichern und iterieren, z.

frames = {} 

for name, s in zip(glob.glob('*.csv'), varNames): 
    frames["Crime" + s] = RanktoDF(name) 

for name in frames: 
    newIndex = frames[name]["Population"] 
+1

Upvote ist für den zweiten Ansatz. Sie können auch ein Wörterbuchverständnis verwenden: 'frames = {" Crime "+ s: RanktoDF (Name) für Name, s in zip (glob.glob. ('*. Csv'), varNames)}' – Alexander

+0

@James das ist großartig ich danke dir sehr. Ich werde den Container auch benutzen, es macht viel mehr Sinn. Schätze die Hilfe – DaithiOK

Verwandte Themen