2014-01-09 2 views
-1

Я пишу класс, который использует рамку данных pandas и создает кучу новых функций на основе ранее существовавших столбцов в dataframe. Я хотел бы принять во внимание тот факт, что в любой момент времени некоторые столбцы, которые я использую для создания функций, могут отсутствовать для данного набора данных. Поэтому перед каждой функцией проверьте, присутствует ли столбец, используемый для создания этой функции, и, если нет, добавьте имя функции в список. Я также хотел бы проверить, было ли создание функции успешным и справляться с ошибками.Дизайн шаблона для создания новых функций в pandas dataframe

Самый лучший способ, что я могу думать, делать это до сих пор является использование 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 

Это кажется немного hackey мне хоть и было интересно, если там может быть более pythonic способ позаботиться об этой проблеме.

+0

вы не должны использовать EXEC, вместо того, чтобы сделать свои функции, как это: '' лямбда x: x ['date'] = pd.DatetimeIndex (x ['date']) '' – Jeff

ответ

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] 

Вы можете также в какой-то степени использовать df.eval для этого в 0,13 см here

Смежные вопросы