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