Betrachten Sie dieses einfache BeispielZugriff auf dynamische Erzeugen eines Pandas Datenrahmen Spalte
import pandas as pd
df = pd.DataFrame({'one' : [1,2,3],
'two' : [1,0,0]})
df
Out[9]:
one two
0 1 1
1 2 0
2 3 0
ich eine Funktion schreiben möchten, wie nimmt gibt einen Datenrahmen df
und eine Spalte mycol
.
Jetzt funktioniert das:
df.groupby('one').two.sum()
Out[10]:
one
1 1
2 0
3 0
Name: two, dtype: int64
das funktioniert auch:
def okidoki(df,mycol):
return df.groupby('one')[mycol].sum()
okidoki(df, 'two')
Out[11]:
one
1 1
2 0
3 0
Name: two, dtype: int64
aber FAILS
def megabug(df,mycol):
return df.groupby('one').mycol.sum()
megabug(df, 'two')
AttributeError: 'DataFrameGroupBy' object has no attribute 'mycol'
Was ist hier falsch?
Ich bin besorgt, dass okidoki
verwendet einige verketten, die einige subtile Bugs schaffen könnten (https://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-assignment-fail-when-using-chained-indexing). Wie kann ich immer noch die Syntax groupby('one').mycol
behalten? Kann der String in etwas umgewandelt werden, das auf diese Weise funktioniert? Danke!
danke kaltspeed. Ich habe meine Frage bearbeitet. Wenn ich eine Zeichenfolge als Eingabe verwende, ist es dann möglich, sie in etwas umzuwandeln, das mit dieser Syntax arbeitet? Sag 'notastring = magicfunction (mycol)' und dann 'df.notastring' –
@ ℕℴℴḆḽḘ Bearbeitete meine Antwort noch einmal. Es ist möglich, aber es ist ein schreckliches Anti-Muster. Tu es nicht. –