@viechdokter: Es gibt keine doppelten eckigen Klammern. Die sind alle immer einzeln zu betrachten. Also ``expression[[foo, bar]]`` hat keine doppelten eckigen Klammern sondern das ist ``expression[…]`` und als Wert/Argument wird da ``[foo, bar]`` angegeben. Und die ”Regel” ist, das Pandas schaut was als Index verwendet wird und je nach Typ was anderes macht. Ein Skalar wird als eine Spalte behandelt, eine Liste als mehrere Spalten, eine Sequenz mit Wahrheitswerten, ein Tupel als Schlüssel in einen Multi-Index, und so weiter. Also so ganz grob. Das ist insgesamt ein bisschen sehr magisch und geht eingentlich gegen gute OOP-Praxis.
Beim Aufruf von `read_csv()` ginge ``parse_dates="Meldedatum", "Refdatum"`` nicht weil der Lexer das als zwei Argumente sehen würde, ``parse_dates="Meldedatum"`` gefolgt von ``"Refdatum"`` und das wäre dann auch noch ein Fehler weil nach Schlüsselwortargumenten keine Positionsargumente mehr folgen dürfen.
Bei dem `groupby()` ist das wieder Pandas, das so nett/magisch ist in der Methode zu prüfen was als `by`-Argument übergeben wurde. Ein einzelner Name, eine Liste, eine Abbildung oder ein `Series`-Objekt oder eine Funktion/etwas aufrufbares.
Wenn man selbst etwas implementieren müsste was eine Liste von Zeichenketten verarbeitet, aber dem Aufrufer auch erlauben würde eine einzelne Zeichenkette zu übergeben, würde das so aussehen:
Code: Alles auswählen
def frobnicate(texts):
if isinstance(texts, str):
texts = [texts]
#
# Now do something with the texts.
#
...
frobnicate("one")
#
# <=>
#
frobnicate(["one"])
Ich würde da eher von abraten so etwas zu machen, nur um dem Aufrufer ein Klammerpaar für die Liste zu ersparen. Letzteres dürfte am Ende der Grund sein warum Pandas das macht: die gehen davon aus, dass das auch viele interaktiv benutzen und nicht nur in Programmen, und die Nutzer von anderen Softwarepaketen in anderen Programmiersprachen sind gewohnt, dass einiges an Magie existiert um Tipparbeit zu sparen. Der Code hinter dem Index/Schlüsselzugriff bei `DataFrame` besteht im Grund aus cirka 50 Zeilen die nacheinander verschiedene Möglichkeiten prüfen was das Argument für ein Typ ist und wie der Wert beschaffen ist, um zu entscheiden welche interne Methode da tatsächlich ausgeführt wird.