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"
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!!