pd.DataFrame (basic) Fragen

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
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

Hallo allerseits, ich habe wiedermal eine "Anfängerfrage" :D

ich habe ein Funktion definiert, die als input optional eine Liste mit Strings erlaubt.

Nun hole ich mir ein Dataframe; wenn die Liste existiert, sollen mir nur diejenigen Reihen auftauchen, die entweder in der Spalte "Vorname" oder in der Spalte "Nachname" erscheinen (dh: wenn in der Liste ein Wort erscheint, welches irgendwo in der Spalte "Lediger Name" erscheint, soll die Reihe nicht auftauchen).

Folgender Vorschlag hätte ich; denke aber, dass es effizienter geht:

Code: Alles auswählen

def Namen(namensliste=None):
        namensframe = DataFrame_xyzabc  #Dieses DataFrame existiert mit Werten
        if namensliste:
            vornamen = namensframe[namensframe["Vorname"].isin(namensliste)]
            nachnamen = namensframe[namensframe["Nachname"].isin(namensliste)]
            namensframe = pd.concat([vornamen , nachnamen ])
            namensframe = namensframe.drop_duplicates(cols=["Vorname", "Nachname"])
kann dies irgendwie vereinfacht werden, wo der Wert direkt in "Vorname" UND "Nachname" gesucht wird?
was nicht geht ist:

Code: Alles auswählen

namensframe = namensframe[namensframe["Vorname"].isin(namensliste) or namensframe["Nachname"].isin(namensliste)]
Besten Dank für die Hilfe
BlackJack

@peterwoodbridge: Versuch mal das ``or`` durch ``|`` zu ersetzen.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

ah das hat geklappt. besten dank!!

Wird die Reihe also automatisch nur einmal erscheinen, wenn der Wert in beiden Spalten vorkommt?

was macht dieser Strich überhaupt?


und noch eine Frage: angenommen, ich habe 10 statt 2 Spalten... gibt es da irgendwie eine Abkürzung oder muss ich dann diesen Strich 9 mal machen und jede Spalte einzeln benennen mit allem drum und dran? oder kann ich für diese 10 Spalten eine Liste generieren irgendwie und dann fortfahren?
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

und noch eine letzte frage für heute:

wie kann ich überprüfen, ob ein bestimmter Name im DataFrame ist in diesen 2 Spalten von oben)?

Mit Zahlen gehts ziemlich einfach, wenn das DataFrame nur Zahlen hat
BlackJack

@peterwoodbridge: ``|`` ist ein binärer Operator wie ``+``, ``-``, oder ``*``. Was er bedeutet hängt von den Datentypen ab, auf die er angewendet wird. Bei `numpy`-Arrays ist es eine bitweise Oder-Verknüpfung der einzelnen Elemente. Also genau das was der ``|``-Operator in Python auch mit ganzen Zahlen macht. Wenn die Zahlen nur aus einem Bit bestehen, also auch als Wahrheitswerte `False` und `True` angesehen werden können, dann entspricht das der logischen Oder-Operation (Disjunktion), also dem was der ``or``-Operator mit Wahrheitswerten macht.

Die Operation gibt es auch als Funktion `numpy.bitwise_or()`. Zusammen mit der `reduce()`-Funktion kann man die auch auf eine Liste von `numpy`-Arrays anwenden.
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

BlackJack hat geschrieben:@peterwoodbridge: ``|`` ist ein binärer Operator wie ``+``, ``-``, oder ``*``. Was er bedeutet hängt von den Datentypen ab, auf die er angewendet wird. Bei `numpy`-Arrays ist es eine bitweise Oder-Verknüpfung der einzelnen Elemente. Also genau das was der ``|``-Operator in Python auch mit ganzen Zahlen macht. Wenn die Zahlen nur aus einem Bit bestehen, also auch als Wahrheitswerte `False` und `True` angesehen werden können, dann entspricht das der logischen Oder-Operation (Disjunktion), also dem was der ``or``-Operator mit Wahrheitswerten macht.

Die Operation gibt es auch als Funktion `numpy.bitwise_or()`. Zusammen mit der `reduce()`-Funktion kann man die auch auf eine Liste von `numpy`-Arrays anwenden.
leider versteh ich dies nicht, wie ich das anwenden müsste :K
BlackJack

Die reduce()-Funktion ist dokumentiert. Die möchte eine Funktion und ein iterierbares Objekt als Argumente. Wenn Du die Funktion `numpy.bitwise_or()` und eine Liste mit den einzelnen Operanden hast, dann gibt es doch nicht wirklich viel Spielraum das mit `reduce()` zu verbinden. ;-)
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

thx, werde es nachlesen!

und wie kann ich überprüfen, ob der Name "Peter" in meinem DataFrame auftaucht? Wenn ich die Spalte zuerst in eine Liste umfunktioniere, dann klappts mit "Peter" in ....
aber gehts nicht auch effizienter?
BlackJack

Code: Alles auswählen

In [49]: df
Out[49]: 
    name  surname
0  Peter    Smith
1   Paul   Cooper
2   Mary  Poppins

In [50]: df['name']
Out[50]: 
0    Peter
1     Paul
2     Mary
Name: name

In [51]: df['name'].values
Out[51]: array([Peter, Paul, Mary], dtype=object)

In [52]: 'Peter' in df['name'].values
Out[52]: True
peterwoodbridge
User
Beiträge: 50
Registriert: Freitag 30. November 2012, 10:26

BlackJack hat geschrieben:

Code: Alles auswählen

In [49]: df
Out[49]: 
    name  surname
0  Peter    Smith
1   Paul   Cooper
2   Mary  Poppins

In [50]: df['name']
Out[50]: 
0    Peter
1     Paul
2     Mary
Name: name

In [51]: df['name'].values
Out[51]: array([Peter, Paul, Mary], dtype=object)

In [52]: 'Peter' in df['name'].values
Out[52]: True
:) so einfach mit .values !! danke!!
Antworten