Seite 1 von 1

Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 11:45
von joergii
Hallo,

vorab: tolles Forum. Lasse mich wohl demnächst häufiger hier sehen.



Mein Problem:

Will viele CSV-Dateien FAST gleichen Inhalts in ein Pandas Dataframe einlesen.

Problem ist, dass

1. in einigen Dateien die Spalte (gleichen Inhalts) einen anderen Namen hat. (siehe unten "Geburtstag" // "Geburtsdatum" )

2. es nur in einigen wenigen Dateien zusätzliche Spalten gibt, die ich trotzdem dem Dataframe hinzufügen will. (siehe unten "Sternzeichen" Nur in CSV1)

3. es in einigen Dateien zwei unterschiedliche Spalten für den gleichen Inhalt gibt (und mal die eine Spalte, mal die andere Spalte gefüllt ist. siehe CSV2: Lieblingsfarbe // Farbe_die_derjenige_mag)
Da in den betroffenen Dateien immer abwechselnd die Spalte gefüllt ist, könnten diese zu einer Spalte zusammengefasst werden.


Beispiel:

CSV 1

Name Vorname Geburtsdatum Sternzeichen Lieblingsfarbe Unwichtig1 Unwichtig2 Unwichtig3 ...
1
2
3
4

CSV 2

Name Vorname Geburtstag Lieblingsfarbe Farbe_die_derjenige_mag Unwichtig1 Unwichtig2 Unwichtig3 ...
1
2
3
4


Im Code sieht das dann so aus:
Mit "usecols" meckert Python bei Problem 1 und 2, dass es die jeweilige Spalte nicht gibt.

Code: Alles auswählen


import os
import glob
import pandas as pd
import numpy as np


df = pd.concat([pd.read_csv(f,
                            sep=';',
                            encoding="ISO-8859-1",
                            header = 0,
                            usecols=['Name', 'Vorname', Geburtsdatum', 'Geburtstag', 'Lieblingsfarbe', 'Farbe_die_derjenige_mag', 'Sternzeichen']
                            )
                for f in glob.glob('*mit_b*.csv')], ignore_index= True)


print(df)




Konnte bisher nix dazu finden.

Danke

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 12:27
von ThomasL
um wieviele csv Dateien handelt es sich denn da, die du einlesen willst?

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 12:43
von joergii
ThomasL hat geschrieben: Sonntag 4. November 2018, 12:27 um wieviele csv Dateien handelt es sich denn da, die du einlesen willst?
Es sind nur ca. 60 Dateien.

Ich muss aber regelmäßig diese Daten auswerten. Die Daten ändern sich regelmäßig.

Habe ich also einmal ein Schema entwickelt, läufts fast automatisiert

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 12:48
von Sirius3
Du mußt nur die Dateien ohne `usecol` einlesen und danach prüfen, welche Spalten existieren und sie entsprechend umsortieren.

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 12:51
von joergii
Habe ich gemacht.
Da die Positionen jeweiligen Spalten unterschiedlich ist (zB Geburtstag, mal 4. Spalte, mal 3. Spalte) zerschießt sich das gesamte Tabelle. Dann steht am Ende der Vorname unter Geburtstag usw

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Sonntag 4. November 2018, 12:54
von ThomasL
Nun, dann automatisiere doch die Umbenennung der Spaltennamen, so das dein obiges Script läuft.
Du könntest zB ein Dictionary erstellen, in dem der Schlüssel der falsche Spaltenname ist und der Wert der richtige.
Du lädst alle csv der Reihe nach ein, wandelst die Spaltennamen um und fügst diese dann zusammen.
Nur so als Idee....

Re: Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

Verfasst: Montag 5. November 2018, 08:47
von joergii
Sirius3 hat geschrieben: Sonntag 4. November 2018, 12:48 Du mußt nur die Dateien ohne `usecol` einlesen und danach prüfen, welche Spalten existieren und sie entsprechend umsortieren.
Danke. Du hast recht. Hatte es vorher ohne usecols versucht. Mein Gefühl war damals, dass ich das DataFrame ohne usecols komplett zerschieße.

tatsächlich liest er erstmal alle möglichen Spalten ein.
Dann gibt es zwar für alle indexierten Datensätze die Spalten "Geburtstag" und "Geburtsdatum", die abwechselnd gefüllt sind, das ist aber nicht weiter schlimm. Die lassen sich anschließend zu einer gemeinsamen Spalte zusammenfügen. Muss jetzt nur noch lesen, wie das geht :)

Danke