Tenir compte cet exemple simpleaccéder à une colonne de Dynamiquement dataframe de pandas géants
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
Je veux écrire une fonction qui prend en entrée une trame de données df
et une colonne mycol
.
Maintenant, cela fonctionne:
df.groupby('one').two.sum()
Out[10]:
one
1 1
2 0
3 0
Name: two, dtype: int64
cela fonctionne aussi:
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
mais PANNE
def megabug(df,mycol):
return df.groupby('one').mycol.sum()
megabug(df, 'two')
AttributeError: 'DataFrameGroupBy' object has no attribute 'mycol'
Quel est le problème ici?
Je suis inquiet que okidoki
utilise une enchaînant qui pourraient créer quelques bugs subtils (https://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-assignment-fail-when-using-chained-indexing).
Comment puis-je toujours garder la syntaxe groupby('one').mycol
? La chaîne mycol
peut-elle être convertie en quelque chose qui pourrait fonctionner de cette façon? Merci!
merci coldspeed. J'ai édité ma question. Mon point est, étant donné une chaîne comme une entrée, est-il possible de le convertir en quelque chose qui fonctionnera avec cette syntaxe? dire 'notastring = magicfunction (mycol)' et ensuite 'df.notastring' –
@ ℕℴℴḆḽḘ Edité ma réponse à nouveau. C'est possible mais c'est un anti-pattern horrible. Ne fais pas ça. –