Python 用于在dataframe中创建新功能的设计模式

Python 用于在dataframe中创建新功能的设计模式,python,oop,design-patterns,pandas,Python,Oop,Design Patterns,Pandas,我正在编写一个类,该类接受pandas数据框架,并基于数据框架中预先存在的列创建一系列新特性。我想考虑一个事实,在任何给定的时间,我用来生成特性的某些列可能不存在于给定的数据集。因此,在创建每个功能之前,请检查用于创建功能的列是否存在,如果不存在,请将功能的名称添加到列表中。我还想检查功能创建是否成功,并处理错误 到目前为止,我能想到的最好的方法是将dict与exec结合使用: mydict = {'preexistingColumn' : ('newfeaturename', "stateme

我正在编写一个类,该类接受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

这对我来说似乎有点像黑客,我想知道是否有一种更像Python的方法来解决这个问题。

你不应该使用
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
,请参见您不应该使用exec,而是将函数设置为这样:
lambda x:x['date']=pd.DatetimeIndex(x['date'])