2017-07-25 3 views
-2

Je suis en train d'être pythonique avec mon code, mais ne peut pas comprendre comment faire:Comment puis-je passer une expression comme mot-clé de fonction en Python

dfSort.assign(i+5=pd.Series(dfWork)) 

où dfSort est un dataframe et pd est pandas géants importer. Bien sûr, le i+5 est une expression et ne peut donc pas être passé en tant que nom de colonne. Mais je veux assigner dynamiquement un nom de colonne dans le code (appelé i+5). La seule façon de le faire est par ailleurs (cela peut se lourd):

if (i+5)== 5: 
    dfSort = dfSort.assign(a=pd.Series(dfWork, index=dfSort.index.values)) 

elif (i+5)==6: 
    dfSort = dfSort.assign(b=pd.Series(dfWork, index=dfSort.index.values)) 

elif (i+5)==7: 
    dfSort = dfSort.assign(c=pd.Series(dfWork, index=dfSort.index.values)) 

elif (i+5)==8: 
    dfSort = dfSort.assign(d=pd.Series(dfWork, index=dfSort.index.values)) 

Est-il possible de le faire comme le premier bloc de code sans les instructions if?

Cela ne fonctionne pas:

Colname = {5: 'a',6 : 'b', 7 : 'c', 8 : 'd'} 
dfSort = dfSort.assign(Colname[i+5]=pd.Series(dfWork)) 

Répondre

1

Si dfWork est un type pd.Series, vous pouvez utiliser le dictionnaire décompactage, comme Ashwini mentionne, comme ceci:

Colname = {5: 'a',6 : 'b', 7 : 'c', 8 : 'd'} 
i = ... # an integer 

dfSort = dfSort.assign(**{ Colname[i + 5] : pd.Series(dfWork, index=dfSort.index.values) }) 

Démo:

In [625]: df 
Out[625]: 
    0 1 2 
0 1 3 4 
1 2 4 5 
2 3 5 6 

In [627]: df.assign(**{Colname[i + 5] : pd.Series(['a', 'b', 'c'], index=df.index.values)}) 
Out[627]: 
    0 1 2 b 
0 1 3 4 a 
1 2 4 5 b 
2 3 5 6 c 

Vous pouvez passer un dictionnaire avec plusieurs paires k: v et effectuer un ssignment pour plusieurs colonnes en même temps.

+0

Bonjour, merci. J'avais essayé ceci 'dfSort = dfSort.assign (** Colname [i + 4] = pd.Series (dfWork))' Il s'avère que j'avais besoin d'ajouter {} et d'utiliser le Colon. – DrizztVD

+0

@DrizztVD Oui. Vous auriez besoin de décompresser un dictionnaire. C'est la solution générale et cela fonctionnera. Si cela vous aide, veuillez considérer [marquer cette réponse acceptée] (https://stackoverflow.com/help/someone-answers). Merci! –

+0

@DrizztVD Je ne sais pas. Je pensais que vous aviez eu une erreur. J'ai mal lu votre commentaire. Ma faute. –