.drop richtig anwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Huitchliputchli
User
Beiträge: 1
Registriert: Mittwoch 20. Dezember 2023, 15:04

Hallo Miteinander,
Ich habe jetzt schon einige Anleitungen, Hilfestellungen und andere Googleeinträge durchforstet, aber mit meinen bisher begrenzten Kenntnissen von Python komme ich da auf keinen grünen Zweig.
Was ich möchte ist, alle Zeilen in denen in der Spalte Cell-ID ein str und kein int Wert ist zu löschen. Ich weiß das es im Dataframe mit dem drop Befehl gehen sollte. Ich scheitere aber daran die Indexliste dafür zu erstellen. Ich habe es derzeit über eine Schleife gelöst, die zwar keine Fehler ausgibt, aber auch die Zeilen nicht löscht. Was ist hier der richtige Ansatz/Was habe ich für einen Denkfehler?
Beispielhaft ein paar Zeilen aus der Spalte (bei allen Feldern die nicht nur aus Zahlen bestehen soll die Zeile gelöscht werden):
1328
1329
1330
XXXX.1001
XXXX.1002
XXXX.1003

Code:

df_As=pd.read_excel(r'lala.xlsm',sheet_name='Cell Assembly',skiprows=2, names=['Cell-ID', 'Stack1','Stack2'], usecols=(3,5,6))

i = 0
while i<len(df_As['Cell-ID']):
z = df_As['Cell-ID']
if type(z)==str:
Ind6 =df_As.loc[(df_As["Cell-ID"] == z)].index
Ind7 = int(Ind6[0])
df_As['Cell-ID'].drop(Ind7, axis=0, inplace=True)
i = i+1
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

IMHO kann das so nicht funktionieren. In Pandas hat jede Spalte einen dtype (=Datentyp). Der ist einheitlich für die Spalte. Wenn du z.B. Zahlen und Strings in einer Spalte hast, dann ist der dtype 'str' oder 'object' - und dann funktioniert auch keine Vergleich auf 'int', weil die Zahlen als String gespeichert sind.

Welchen dtype hat denn die entsprechende Spalte bei dir?

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Huitchliputchli: Neben dem was noisefloor schon anmerkte: Wenn man eine Schleife über Pandas-Datenzeilen/-zellen oder auch Numpy-Arrays schreibt, macht man in der Regel etwas falsch. Wenn man etwas mit diesen Objekten macht, dann üblicherweise Aufrufe die sich auf viele Werte beziehen und nicht in Python-Code jeden Einzelnen betrachten.

Hier wäre beispielsweise ein möglicher Ansatz die gesamte Spalte in Zahlen umzuwandeln, mit der Rückfalloption von NaN für Werte, die sich nicht umwandeln lassen, und dann alle Zeilen zu nehmen in denen die Spalte nicht NaN enthält. Das wären (ungetestet) folgende zwei Zeilen:

Code: Alles auswählen

    df_as["Cell-ID"] = pd.to_numeric(df_as["Cell-ID"], "coerce")
    df_as = df_as[df_as["Cell-ID"].notna()]
Es wäre auch sehr ineffizient wiederholt einzelne Zeilen aus einem DataFrame zu löschen. Löschen einer Zeile bedeutet das umkopieren der nicht gelöschten Zeilen.

Könnte/würde man das so machen, dann nicht mit einer ``while``-Schleife, denn die ist in dem gezeigten Code eigentliche eine kompliziert ausgedrückte ``for``-Schleife. Wobei Schleifen der Form ``for i in range(len(sequence)):`` in Python ein „anti-pattern“ sind, denn man kann in Python direkt über die Elemente von Sequenzen iterieren, ohne den unnötigen Umweg über einen Laufindex.

Typ-Tests macht man nicht mit `type()` und ``==`` sondern mit `isinstance()`. Und das auch nur wenn es keine andere Möglichkeit gibt das ohne Typtest zu lösen. In seltenen Fällen ist das eine sinnvolle Lösung, aber meistens ist das, insbesondere in einer objektorientierten Programmiersprache, eher ein Warnzeichen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen.

Man nummeriert keine Namen. Dann will man sich entweder bessere Namen überlegen, oder gar keine Einzelnamen/-werte verwenden, sondern eine Datenstruktur. Oft eine Liste.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten