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:
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.
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
Sind Sie sicher, dass diese Zeile wie erwartet funktioniert: 'df = df [df.Index! = 'Index'] #Drop alle zusätzlichen Header' – Alexander
@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