2017-07-25 25 views
-2

我想是Python的我的代码,但无法弄清楚如何做到:我如何通过表达式作为Python中的函数关键字

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

其中DFSORT是一个数据帧和Pd是大熊猫进口。当然,i+5是一个表达式,因此不能作为列名传递。但我想在代码中动态分配一个列名称(称为i+5)。以其他方式做到这一点的唯一方法是(这可能很麻烦):

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)) 

有没有办法做到这一点,如第一个代码块没有if语句?

这不起作用:

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

回答

1

如果dfWorkpd.Series类型,那么你可以使用字典拆包,如阿什维尼提到,像这样:

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) }) 

演示:

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 

您可以传递具有多个k:v对的字典,并执行同时为多个列进行分配。

+0

嗨,好的,谢谢。我试过这个'dfSort = dfSort.assign(** Colname [i + 4] = pd.Series(dfWork))'原来我需要添加和使用Colon。 – DrizztVD

+0

@DrizztVD是的。你需要解开一个字典。这是一般的解决方案,并且会起作用。如果有帮助,请考虑[标记此答案接受](https://stackoverflow.com/help/someone-answers)。谢谢! –

+0

@DrizztVD我不知道。我以为你得到了一个错误。我误解了你的评论。我的错。 –

相关问题