我正在尝试使用我的代码进行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) )
答案 0 :(得分:1)
如果dfWork
是pd.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对的字典,并同时为多个列执行分配。