Seite 1 von 1

pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 10:32
von peterwoodbridge
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

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 10:50
von BlackJack
@peterwoodbridge: Versuch mal das ``or`` durch ``|`` zu ersetzen.

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 11:16
von peterwoodbridge
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?

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 11:52
von peterwoodbridge
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

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 11:54
von 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.

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 12:04
von peterwoodbridge
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

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 12:28
von 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. ;-)

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 12:37
von peterwoodbridge
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?

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 13:03
von 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

Re: pd.DataFrame (basic) Fragen

Verfasst: Montag 15. April 2013, 13:09
von peterwoodbridge
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!!