🗂️ Vereinsregister – Automatisierte Datenbereinigung

CSV-Merging, Duplikat-Entfernung & Kontaktfilterung mit Python Pandas

PythonPandasCSVAutomation

📊 Zwei Tools – eine Aufgabe

Vereinsregister-Daten aus Google Contacts kommen oft fragmentiert als mehrere CSV-Dateien. Diese beiden Python-Skripte mergen, deduplizieren und filtern sie automatisch – aus Chaos wird eine saubere, nutzbare Kontaktliste.

🔗
merge_csv_files.py
Führt alle vereinsregister_google_kontakte*.csv mit pd.concat() zusammen und entfernt Duplikate.
🧹
filter_contacts.py
Entfernt Duplikate nach Name+Vereinsname und filtert Kontakte ohne Telefon und Email heraus.
📊
Statistik-Ausgabe
Zeigt an: Kontakte mit Telefon, mit Email, mit beidem – für saubere Erfolgskontrolle.
🔄
Wiederverwendbar
Glob-Pattern-basiert – neue CSV-Dateien werden automatisch erkannt und eingebunden.

💻 Echter Code aus dem Projekt

merge_csv_files.py – Alle CSVs zu einer zusammenführen

import pandas as pd
import glob

def merge_csv_files():
    # Alle passenden CSV-Dateien finden
    csv_files = glob.glob('vereinsregister_google_kontakte*.csv')
    
    if not csv_files:
        print("Keine CSV-Dateien gefunden!")
        return

    dfs = []
    for file in csv_files:
        try:
            df = pd.read_csv(file, encoding='utf-8')
            dfs.append(df)
            print(f"{file} erfolgreich eingelesen")
        except Exception as e:
            print(f"Fehler bei {file}: {e}")

    # Zusammenführen & Duplikate entfernen
    merged_df = pd.concat(dfs, ignore_index=True)
    merged_df = merged_df.drop_duplicates()

    output_file = 'vereinsregister_google_kontakte_komplett.csv'
    merged_df.to_csv(output_file, index=False, encoding='utf-8')
    print(f"Fertig! {len(merged_df)} Vereine in {output_file}")

filter_contacts.py – Bereinigung & Filterung

import pandas as pd

def filter_contacts():
    df = pd.read_csv('vereinsregister_google_kontakte_komplett.csv',
                     encoding='utf-8')
    print(f"Ursprünglich: {len(df)} Kontakte")

    # 1. Duplikate nach Name + Vereinsname
    df = df.drop_duplicates(subset=['Name', 'Vereinsname'])
    print(f"Nach Duplikat-Entfernung: {len(df)}")

    # 2. Nur Kontakte mit Telefon ODER Email behalten
    df = df[~((df['Telefon'].isna() | 
               df['Telefon'].str.strip() == '') & 
              (df['E-Mail'].isna() | 
               df['E-Mail'].str.strip() == ''))]
    print(f"Nach Filterung (Tel. oder Email): {len(df)}")

    # 3. Alphabetisch sortieren
    df = df.sort_values('Name')

    output_file = 'vereinsregister_google_kontakte_gefiltert.csv'
    df.to_csv(output_file, index=False, encoding='utf-8')

    # Statistik
    print(f"\nTel: {df['Telefon'].notna().sum()}")
    print(f"Email: {df['E-Mail'].notna().sum()}")
    print(f"Beides: {df[(df['Telefon'].notna()) & (df['E-Mail'].notna())].shape[0]}")

if __name__ == "__main__":
    filter_contacts()

Workflow: Vom Export zur bereinigten Liste

# 1. Google Contacts Export als CSV (mehrere Dateien)
#    → vereinsregister_google_kontakte_01.csv
#    → vereinsregister_google_kontakte_02.csv

# 2. Mergen
python merge_csv_files.py
# → vereinsregister_google_kontakte_komplett.csv

# 3. Filtern & bereinigen
python filter_contacts.py
# → vereinsregister_google_kontakte_gefiltert.csv

# Ergebnis: Saubere Liste, sortiert, ohne Dubletten,
#           nur Kontakte mit mind. Telefon oder Email

🎯 Business Value

⏱️

Statt Stunden: Sekunden

400+ Vereinskontakte manuell zu bereinigen dauert Stunden. Das Skript erledigt es in unter einer Sekunde.

🎯

Wiederverwendbar

Bei jeder Aktualisierung der Kontaktdaten einfach neu ausführen – immer das gleiche, konsistente Ergebnis.

📊

Datenqualität messbar

Die Statistik-Ausgabe zeigt sofort, wie viele Kontakte wirklich erreichbar sind – keine blinde Datenhaltung.