Pandas/zwei csv vergleichen und streichen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

Ich versuche Pandas zu benutzen um zwei CSV zu vergleichen. Die habe ich mit einem Programm selber generiert und aus Mysql (xampp server intern) exportiert. Als Liste sieht das so aus die man unter irgend einer CSV datei speichern kann
  • "id";"Anrede";"Vorname";"Nachname";"Email";"Strasse";"Nummer";"Ort";"PLZ";"Bundesland";"Kommentare";"Unterstuetzer";"reg_date"
    "1";"Herr";"Otto";"Sauel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 11:49:55"
    "2";"Herr";"Reihard";"sauter";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 12:02:11"
    "3";"Herr";"Bernd";"richard";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 12:03:32"
    "4";"Herr";"Robby";"Reinersl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 09:39:52"
    "5";"Herr";"Rudi";"fenterl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 09:46:10"
    "6";"Herr";"Robert";"Swinkler";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 10:35:22"
    "7";"Herr";"Robert";"Forkerl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 12:47:39"
    "8";"Herr";"Robert";"Svolkerl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:36"
    "9";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:41"
    "10";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:54"
    "11";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:03:27"
  • ["id";"Anrede";"Vorname";"Nachname";"Email";"Strasse";"Nummer";"Ort";"PLZ";"Bundesland";"Kommentare";"Unterstuetzer";"reg_date"
    "1";"Herr";"Robert";"Sauel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 11:49:55"
    "2";"Herr";"Robert";"sauter";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 12:02:11"
    "3";"Herr";"Robert";"richard";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-28 12:03:32"
    "4";"Herr";"Robert";"Reinersl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 09:39:52"
    "5";"Herr";"Robert";"fenterl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 09:46:10"
    "6";"Herr";"Robert";"Swinkler";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 10:35:22"
    "7";"Herr";"Robert";"Forkerl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 12:47:39"
    "8";"Herr";"Robert";"Svolkerl";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:36"
    "9";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:41"
    "10";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:01:54"
    "11";"Herr";"Robert";"Sanuel";"samuel@email";"HAGELBERGERSTR";"9";"bERLIN";"10000";"bERLIN";"haha";"ok";"2024-11-29 13:03:27"

    /list]
    Bei meinen Proben habe ich festgestellt: Man muß für panda zwei csv dateien bilden die beide die selbe Struktur (mit Zeilenüberschrift )hat.
    Ich habe nun mit Hilfe von mehrmaligen Versuchenundmit Hilfe von Mikrosoft Copilot folgendes Listing mit Teilen daraus kombiniert bzw. verändert.

    Code: Alles auswählen

     import pandas as pd
    import numpy
    
    
    df = pd.read_csv("listeprobe1.csv")#importiere in Panda als df
    da = pd.read_csv("listeprobe2.csv")#importiere in Panda als da
    data = pd.concat([da,df]) #mach aus zwei eine datei data
    
    #dienächsten fünf zeilen stammen aus copilot
    #for data in df3:
    #data = {
    #"name": ["Sally", "Mary", "John", "Mary"],
    #"age": [50, 40, 30, 40],
    #"qualified": [True, False, False, False]
    #}
    data = pd.DataFrame(data)
    
    print("Original DataFrame:")
    print(data)
    
    # --- Remove duplicates ---
    # Keep the first occurrence (default)
    data_no_dupes = data.drop_duplicates()
    
    print("\nAfter drop_duplicates (keep='Vorname'):")
    print(data_no_dupes)
    
    # --- Remove duplicates based on specific columns ---
    data_no_dupes_name = data.drop_duplicates(subset=['Vorname'], keep='last')
    
    print("\nAfter drop_duplicates on 'Vorname' (keep='last'):")
    print(data_no_dupes_name)
    
    # --- Remove duplicates in-place ---
    data.drop_duplicates(inplace=True, ignore_index=True)
    
    print("\nIn-place removal with reindexing:")
    print(data)
     
    Irgendwie ist das Ergebnis komisch weil zuwenig Duplikate gelöscht werden. Bei Vorname müßten mehr verschwinden
Benutzeravatar
__blackjack__
User
Beiträge: 14192
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Warum denkst Du das? Welche sollten da gelöscht werden und warum?
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

Wenn ich das richtig verstanden habe wird die Spalte Vorname genommen um den unterschied festzustellen und dann alles gelöscht was nun doppelt ist. Bei mir bleiben zuviele Robert übrig
Benutzeravatar
__blackjack__
User
Beiträge: 14192
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Dann hast Du das nicht richtig verstanden. Wenn Du das auf die Spalte "Vorname" beziehen möchtest, dann musst Du das auch angeben. Der Rechner kann ja nicht raten welche Spalte Du meinst, Wenn Du keine Spalten angibst, bezieht sich das auf alle Spalten, und die Roberts unterscheiden sich halt mindestens in einer Spalte, also sind es auch keine Duplikate.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
juergenkulow
User
Beiträge: 12
Registriert: Freitag 6. Juni 2025, 08:09

Semikolon als Trennzeichen beraucht pd.read_CSV:

Code: Alles auswählen

# zwei CSV vergleichen
# pd.read_csv ,sep=';'
# import numpy #Wird nicht benutzt.
import pandas as pd

df = pd.read_csv("/tmp/listeprobe1.csv",sep=';')#importiere in Panda als df
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html#pandas.read_csv
da = pd.read_csv("/tmp/listeprobe2.csv",sep=';')#importiere in Panda als da
data = pd.concat([da,df]) #mach aus zwei eins
data_no_dupes = data.drop_duplicates()
print(data_no_dupes)
data_no_dupes_name = data.drop_duplicates(subset=['Vorname'], keep='last')
print(data_no_dupes_name)
data.drop_duplicates(inplace=True, ignore_index=True)
# Gebt das DataFrame mit entfernten doppelten Zeilen zurück.
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html
print(data)
"""
%runfile /tmp/cmp.py --wdir
    id Anrede  Vorname  ... Kommentare Unterstuetzer             reg_date
0    1   Herr   Robert  ...       haha            ok  2024-11-28 11:49:55
1    2   Herr   Robert  ...       haha            ok  2024-11-28 12:02:11
2    3   Herr   Robert  ...       haha            ok  2024-11-28 12:03:32
3    4   Herr   Robert  ...       haha            ok  2024-11-29 09:39:52
4    5   Herr   Robert  ...       haha            ok  2024-11-29 09:46:10
5    6   Herr   Robert  ...       haha            ok  2024-11-29 10:35:22
6    7   Herr   Robert  ...       haha            ok  2024-11-29 12:47:39
7    8   Herr   Robert  ...       haha            ok  2024-11-29 13:01:36
8    9   Herr   Robert  ...       haha            ok  2024-11-29 13:01:41
9   10   Herr   Robert  ...       haha            ok  2024-11-29 13:01:54
10  11   Herr   Robert  ...       haha            ok  2024-11-29 13:03:27
0    1   Herr     Otto  ...       haha            ok  2024-11-28 11:49:55
1    2   Herr  Reihard  ...       haha            ok  2024-11-28 12:02:11
2    3   Herr    Bernd  ...       haha            ok  2024-11-28 12:03:32
3    4   Herr    Robby  ...       haha            ok  2024-11-29 09:39:52
4    5   Herr     Rudi  ...       haha            ok  2024-11-29 09:46:10

[16 rows x 13 columns]
    id Anrede  Vorname  ... Kommentare Unterstuetzer             reg_date
0    1   Herr     Otto  ...       haha            ok  2024-11-28 11:49:55
1    2   Herr  Reihard  ...       haha            ok  2024-11-28 12:02:11
2    3   Herr    Bernd  ...       haha            ok  2024-11-28 12:03:32
3    4   Herr    Robby  ...       haha            ok  2024-11-29 09:39:52
4    5   Herr     Rudi  ...       haha            ok  2024-11-29 09:46:10
10  11   Herr   Robert  ...       haha            ok  2024-11-29 13:03:27

[6 rows x 13 columns]
    id Anrede  Vorname  ... Kommentare Unterstuetzer             reg_date
0    1   Herr   Robert  ...       haha            ok  2024-11-28 11:49:55
1    2   Herr   Robert  ...       haha            ok  2024-11-28 12:02:11
2    3   Herr   Robert  ...       haha            ok  2024-11-28 12:03:32
3    4   Herr   Robert  ...       haha            ok  2024-11-29 09:39:52
4    5   Herr   Robert  ...       haha            ok  2024-11-29 09:46:10
5    6   Herr   Robert  ...       haha            ok  2024-11-29 10:35:22
6    7   Herr   Robert  ...       haha            ok  2024-11-29 12:47:39
7    8   Herr   Robert  ...       haha            ok  2024-11-29 13:01:36
8    9   Herr   Robert  ...       haha            ok  2024-11-29 13:01:41
9   10   Herr   Robert  ...       haha            ok  2024-11-29 13:01:54
10  11   Herr   Robert  ...       haha            ok  2024-11-29 13:03:27
11   1   Herr     Otto  ...       haha            ok  2024-11-28 11:49:55
12   2   Herr  Reihard  ...       haha            ok  2024-11-28 12:02:11
13   3   Herr    Bernd  ...       haha            ok  2024-11-28 12:03:32
14   4   Herr    Robby  ...       haha            ok  2024-11-29 09:39:52
15   5   Herr     Rudi  ...       haha            ok  2024-11-29 09:46:10

[16 rows x 13 columns]
"""
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

Es ist zum Mäusemelken. Mit welcher Version ich das Programm geschrieben habe bzw. mit welcher env kann ich mitlerweile nicht mehr nachvollziehen. Tatsache die Probleme nach einem gescheiterten Updateversuch sind da. Nun unter einer zeitweiligen(nicht dauerhaften Administration) des Spider allone Installation habe ich mit conda install mysql und conda install pandas in eine neue env namens runtime beides installiert. Jetzt probiere ich ohne Adminrechte, mein Programm und funktioniert nur halb.

Code: Alles auswählen

import pandas as pd
import numpy
db = pd.read_csv("listeprobe1.csv")#importiere in Pandas als db
da = pd.read_csv("listeprobe2.csv")#importiere in Pandas als da
data = pd.concat([da,db]) #mach aus zwei eine datei data
print("Original DataFrame:")
print(data)#bis hier funktioniert es aber data als DataFrame ist hier schon nicht gültig. 
#Im variablenmanager steht data als DataFrame mit allen zeilen der beiden csv dateien.


data = data.drop_duplicates(subset=['Vorname']) #soll alle  Einträge löschen die mehrfach 
#in der Zeile Vorname vorkommen. es funktioniert nicht weil hier keine DataFrame erkannt wird und nach dem Punkt das als Text deklariert wird
 
print("\nAfter drop_duplicates(subset=['Vorname'):")
print(data)# deshalb wird hiermit errorcode ausgegeben
KeyError Traceback (most recent call last)
C:\ProgramData\spyder-6\envs\spyder-runtime\Lib\site-packages\spyder_kernels\customize\code_runner.py in ?(self, code, filename, ns_globals, ns_locals, post_mortem, exec_fun, capture_last_expression, global_warning)
657 error_type, error, tb = sys.exc_info()
658 self._post_mortem_excepthook(error_type, error, tb)
659 else:
660 # We ignore the call to exec
--> 661 self.shell.showtraceback(tb_offset=1)
662 finally:
663 __tracebackhide__ = "__pdb_exit__"

C:\ProgramData\spyder-6\envs\spyder-runtime\Lib\site-packages\spyder_kernels\customize\utils.py in ?(code_ast, globals, locals, exec_fun, filename)
207 if filename is None:
208 filename = "<stdin>"
209 exec_fun(compile(code_ast, filename, "exec"), globals, None)
210 finally:
--> 211 if use_locals_hack:
212 # Cleanup code
213 globals.pop("_spyderpdb_code", None)
214 if len(globals["_spyderpdb_locals"]) > 1:

c:\users\gbt b650m gamingx ax\documents\myphyton\csvvergleichstest.py in ?()
12 print("Original DataFrame:")
13 print(data)#bis hier funktioniert es
14
15
---> 16 data = data.drop_duplicates(subset=['Vorname'])
17
18 print("After drop_duplicates(subset=['Vorname']:")
19 print(data)

C:\ProgramData\spyder-6\envs\spyder-runtime\Lib\site-packages\pandas\core\frame.py in ?(self, subset, keep, inplace, ignore_index)
6836
6837 inplace = validate_bool_kwarg(inplace, "inplace")
6838 ignore_index = validate_bool_kwarg(ignore_index, "ignore_index")
6839
-> 6840 result = self[-self.duplicated(subset, keep=keep)]
6841 if ignore_index:
6842 result.index = default_index(len(result))
6843

C:\ProgramData\spyder-6\envs\spyder-runtime\Lib\site-packages\pandas\core\frame.py in ?(self, subset, keep)
6968 # Otherwise, raise a KeyError, same as if you try to __getitem__ with a
6969 # key that doesn't exist.
6970 diff = set(subset) - set(self.columns)
6971 if diff:
-> 6972 raise KeyError(Index(diff))
6973
6974 if len(subset) == 1 and self.columns.is_unique:
6975 # GH#45236 This is faster than get_group_index below

KeyError: Index(['Vorname'], dtype='object')


Wie bekommt man hier Abhilfe? Gestern hatte ich noch mit dem Trick "data = pd.DataFrame (data)" zeitweise den status eines DataFrame wieder gegeben data lagen ja als data im Speicher.
Benutzeravatar
__blackjack__
User
Beiträge: 14192
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@oldboyJR: Du liest die Daten halt falsch ein. Die sind mit ";" getrennt, was Du hier aber nicht angibst, also landen alle Spalten in *einer* Spalte und es gibt keine Spalte mit dem Titel "Vorname". Das Problem hatte der Code aber schon vorher, der ist also noch *nie* Fehlerlos durchgelaufen, mit den Dateiinhalten. Wenn das mal durchgelaufen war, dann hatten die Dateien tatsächlich "," statt ";" zum Trennen der Werte. Das hat nichts mit der Python- oder Pandas-Version zu tun, und auch nicht mit dem Thema venv.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Benutzeravatar
snafu
User
Beiträge: 6892
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Einfach mal die Zwischenergebnisse angucken, spätestens wenn der Code nicht das erwartete Ergebnis liefert, soll auch ganz hilfreich sein. Entweder mit ein paar print()-Aufrufen oder durch Einfügen des relevanten Teils in den interaktiven Interpreter. Dann kann man sehen, was wirklich in ``da`` und ``db`` steht. Wenn man da beim Einlesen schon einen Fehler durch eine falsche Konfiguration des Reader gemacht hat, dann können die Folgeschritte die einmal falsch gelesenen Daten leider nicht auf magische Weise im Sinne des Programmierers korrigieren...
mechanicalStore
User
Beiträge: 187
Registriert: Dienstag 29. Dezember 2009, 00:09

@oldboyJR: Guck halt, was Dir hier auffällt (ungetestet):

Code: Alles auswählen

import pandas as pd

if __name__ == '__main__':

    da = pd.read_csv("listeprobe1.csv", sep=';')
    db = pd.read_csv("listeprobe2.csv")

    print(da.columns)
    print(da.dtypes)
    print()
    print(db.columns)
    print(db.dtypes)

    da.drop_duplicates(subset='Vorname', inplace=True)
    # db.drop_duplicates(subset='Vorname', inplace=True)     # <-------- Zum Testen auskommentieren

    print(da)
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

Danke für die Wunderwaffe

Code: Alles auswählen

if __name__ == '__main__': 
die erinnert mich an ein Java Konstrukt aus einem java FX Tutorial ich so ähnlich wie: this main = main (obwohl es etwas verbindet anstatt verhindert. Damit funktioniert es. Mein altes Listing erweitert

Code: Alles auswählen

import pandas as pd

if __name__ == '__main__':
    
        # importiere in Panda als df
    df = pd.read_csv("listeprobe1.csv", sep = ';')
    # https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html#pandas.read_csv
    da = pd.read_csv("listeprobe2.csv", sep = ';')
    # importiere in Panda als da
    data = pd.concat([da, df])  # mach aus zwei eins
   
    print (data)
    data = data.drop_duplicates(subset=['Nachname'], keep='last')
    print(data)
    data = data.reset_index()
    print(data) 
tut was es soll
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

PS danke mechanicelStore Aber dein LIsting mit den jeweiligen Versuch die eingelesenen Daten erst zu droppen hat nach dem löschen der raute einen Fehler produziert. Es tut sich wohl das selbe Problem wie bei mir auf ein zweites drop_duplikates auch mit anderen Parameter will er nicht durchführen!
oldboyJR
User
Beiträge: 85
Registriert: Donnerstag 28. März 2024, 16:19

jaja auf den zweiten blick das mit dem seperator haha
Antworten