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

时间:2014-01-09 18:57:31

标签: python oop design-patterns pandas

我正在编写一个接收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方法可以解决这个问题。

1 个答案:

答案 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.evalhere