Pandas, einlesen mehrerer CSV-Dateien mit unterschiedlichen Spaltennamen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
joergii
User
Beiträge: 6
Registriert: Sonntag 4. November 2018, 11:16

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
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

um wieviele csv Dateien handelt es sich denn da, die du einlesen willst?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
joergii
User
Beiträge: 6
Registriert: Sonntag 4. November 2018, 11:16

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
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt nur die Dateien ohne `usecol` einlesen und danach prüfen, welche Spalten existieren und sie entsprechend umsortieren.
joergii
User
Beiträge: 6
Registriert: Sonntag 4. November 2018, 11:16

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
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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....
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
joergii
User
Beiträge: 6
Registriert: Sonntag 4. November 2018, 11:16

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
Antworten