如何在Python

时间:2017-07-25 09:06:58

标签: python pandas expression keyword

我正在尝试使用我的代码进行pythonic,但无法弄清楚该怎么做:

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

其中dfSort是Dataframe,pd是pandas导入。当然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 个答案:

答案 0 :(得分:1)

如果dfWorkpd.Series类型,那么您可以使用字典解包,正如Ashwini所提到的那样:

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对的字典,并同时为多个列执行分配。