2016-12-02 2 views
0

Also ich schreibe in Python mit Pandas. Der Code, den ich geschrieben habe, extrahiert bestimmte Spaltenüberschriften aus einer Excel-Datei, was funktioniert, aber ich möchte nicht immer in den Code gehen müssen, um den Namen der Spaltenüberschriften zu ändern, die bei der Arbeit an neuen Dateien mit denselben Daten extrahiert werden.Wie man die gleiche Spaltenüberschrift liest, aber in neuen Dateien anders buchstabiert. Pandas

Hier ist meine Extraktionsmethode:

xlsx = pd.ExcelFile('filepath') 
df = pd.read_excel(xlsx, 'Tabelle1') 

df2 = df[['ZONE_NAME','POLYGONSTRING']] 

df2.to_csv('filepath\name', sep=';', index=False, header=True) 

Also, wenn ich diesen Code zu einem anderen laufen Excel-Datei ich es jeden möglichen Namen für „ZONE_NAME“ akzeptieren wollen, die „Zonenname“, „Zonenname“ sein könnte etc ...

+0

Können Sie die relevanten Teile des von Ihnen geschriebenen Codes anzeigen? Sie scheinen zu fragen, wie Sie nicht jedes Mal auf jede einzelne Spalte verweisen müssen, wenn Sie eine Datei laden, sondern wenn Sie die Datei mit '' 'df = pd.read_excel()' '' wie Sie sagen, auf Header zugreifen ohne etwas ändern zu müssen, sollte so einfach sein wie '' 'columns = list (df.columns.values)' ''. Fügen Sie also unbedingt das ein, was Sie für eine bessere Antwort geschrieben haben. – ralston

+0

@ralston Ich entschuldige mich, ich habe Änderungen an der Frage vorgenommen, macht das ein bisschen mehr Sinn für was ich bitte? Entschuldigung, ich bin schrecklich über diese Seite, danke nochmal! –

Antwort

1

Wenn Ihr Problem nur auf verschiedene Arten beschränkt ist, eine Spalte wie "ZONE_NAME" zu schreiben (zB "zone_name", "ZONENAME", "ZONE_name", etc.), dann benutzen Sie einfach einen Filtertyp Spaltennamen:

xlsx = pd.ExcelFile('filepath') 
df = pd.read_excel(xlsx, 'Tabelle1') 

# This will filter out any non-alphabetical characters from each 
# column name and lower it (so "ZONE_NAME" "ZONENAME" and "zone_NAME" 
# would become "zonename") 
filtered_columns = [re.sub('[^a-zA-Z]', "", c).lower() for c in list(df.columns.values)] 
df.columns = filtered_columns 

df2 = df[filtered_columns] 

df2.to_csv('filepath\name', sep=';', index=False, header=True) 

Hoffe das hilft.

+0

JA, das ist genau das, was ich versucht habe zu bekommen. Wenn ich den obigen (zweiten) Code ausführe, bekomme ich diesen Fehler obwohl KeyError: "['locationname' 'locationid' 'zonetype' 'zonename' 'polygonstring' \ n 'reservedspaces' 'validfrom' 'validto' 'taxrate' ' Bemerkung '] nicht im Index " Es kommt aus dem" df2 = df [Spalten] "inline @ralston –

+0

@Michael Ich habe die ursprüngliche Antwort bearbeitet. Bitte akzeptieren Sie es als Antwort und Upvote, wenn es Ihnen hilft. – ralston

+0

Vielen Dank @ralston –

1

Pandas read_csv erkennt Spaltenüberschriften automatisch. Keine Notwendigkeit, etwas im Voraus zu spezifizieren. In Ihrem Beitrag fehlen die Links zu einem Bild. Es wäre jedoch besser, die Daten in einer Zeile zu posten.

+0

Also die Excel-Daten gibt es ursprünglich 5 andere Spaltenüberschriften. "ZONE_NAMES" und "POLYGONSTRINGS" sind diejenigen, die herausgeschnitten werden, was funktioniert, aber wenn ich diesen Code für andere Excel-Dateien mit den gleichen benötigten Daten verwende, können sich die Spaltenköpfe für den gleichen Namen ändern, wenn das Sinn macht; "zonename", "Zonenname" etc ... @dartdog –

+0

So können Sie die Spalten nach Position anstelle von Label zugreifen, wenn das hilft? Sie könnten die Spalten einfach beliebig in etwas Konsequentes umbenennen, wenn das besser funktioniert. Kurz gesagt, es scheint nicht so einfach zu sein, Ihr zugrunde liegendes Problem zu verstehen. – dartdog

+0

Nicht vertraut mit Pandas 'read_csv, aber es sieht nicht so aus, als würde es die String-Normalisierung durchführen. Wenn es zum Extrahieren der Header verwendet werden kann, könnte er die Header-Zeichenfolge, die er sucht, normalisieren und sehen, ob dieser Header in dieser extrahierten Liste vorhanden ist, und dann seine Extraktionsmethode mit dieser Zeichenfolge ausführen. Auch kein Python-Entwickler, der meinen Kopf dorthin klebt, wo er nicht hingehört. – TheUnknownGeek

Verwandte Themen