我正在编写一个接收pandas数据框的类,并根据数据框中预先存在的列创建一堆新功能。我想考虑到这样一个事实,即在任何给定时间,我用于生成要素的某些列可能不会出现给定数据集。因此,在创建每个功能之前,请检查用于创建功能的列是否存在,如果不存在,请将功能的名称添加到列表中。我还想检查功能创建是否成功并处理错误。
到目前为止,我能想到这样做的最好方法是将dict与exec结合使用:
mydict = {'preexistingColumn' : ('newfeaturename', "statement"),
'date' : ('date', "df['date'] = pd.DatetimeIndex(df['date'])"),
'amount' : ('new', "df['new'] = df.groupby('group').amount.apply(f)")}
for key, value in mydict.items():
if key is not in the dataframe:
missingFeaturesList.append(V[0])
try:
exec v[1]
except Exception:
deal with exception
这对我来说似乎有些犹豫不决,并且想知道是否有更多的pythonic方法可以解决这个问题。
答案 0 :(得分:2)
你不应该使用exec
;更好的习惯是:
In [20]: funcs = { 'foo' : lambda df: Series(10,index=df.index), 'bar' : lambda df: df['foo']+1 }
In [24]: df = DataFrame(np.random.randn(5,2),columns=list('AB'))
In [25]: for k in ['foo','bar']:
....: if k not in df:
....: df[k] = funcs[k](df)
....:
In [26]: df
Out[26]:
A B foo bar
0 0.733404 0.640446 10 11
1 0.927252 0.421439 10 11
2 2.355565 0.839521 10 11
3 0.260136 -0.016420 10 11
4 0.256628 -0.766033 10 11
[5 rows x 4 columns]
您也可以在0.13中使用df.eval
,here