2016-11-15 2 views
0

Я пытаюсь назначить новый столбец существующему кадру данных pandas mydf. Добавляемая серия является результатом оценки выражения, которое передается как строка. Выражение может содержать вызовы функций питона, например:Использование назначения в pandas с данными временных рядов и groupby

formula = 'myfunction(mydf.v1)' 

myfunction выглядит следующим образом

def myfunction(series): 
    return recursive_filter(series, 0.1) 

Следующий код будет оценивать выражение и выполнить myfunction и назначить столбец v2 для mydf

mydf.assign(v2 = eval(formula)) 

Однако мне нужно выполнить функцию Market. Вывод должен выглядеть таблицу ниже

Market  Date   v1 v2 
UK   2013-01-01 10 10.00 
UK   2013-01-02 10 11.00 
UK   2013-01-03 10 11.10 
UK   2013-01-04 10 11.11 
US   2013-01-01 10 10.00 
US   2013-01-02 10 11.00 
US   2013-01-03 10 11.10 
US   2013-01-04 10 11.11 

Я попытался следующий код (который я не уверен, что будет производить правильный результат ...)

mydf.groupby('CrossSection').apply(mydf.assign(v2 = eval(formula))) 

Однако это приводит к этой ошибке

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed 

ответ

0

Одна из проблем, с которой вы сталкиваетесь, заключается в том, что формула жестко кодирует DataFrame для ее применения, то есть mydf.

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

Я переписал формулу, чтобы принять форматирование строки, с которой должен применяться данный файл.

from statsmodels.tsa.filters.filtertools import recursive_filter 

formula = 'myfunction({}.v1)' 
def myfunction(series): 
    return recursive_filter(series, 0.1) 

df2 = mydf.groupby('Market').apply(lambda df: df.assign(v2 = eval(formula.format("df")))) 
df2.index = df2.index.droplevel(level=0) 
df2 

Результат:

Market  Date v1  v2 
0  UK 2013-01-01 10 10.00 
1  UK 2013-01-02 10 11.00 
2  UK 2013-01-03 10 11.10 
3  UK 2013-01-04 10 11.11 
4  US 2013-01-01 10 10.00 
5  US 2013-01-02 10 11.00 
6  US 2013-01-03 10 11.10 
7  US 2013-01-04 10 11.11 
Смежные вопросы