2016-11-15 40 views
0

我正在尝试为现有的熊猫数据框指定一个新列mydf。要添加的系列是评估以字符串形式传递的表达式的结果。该表达式可以包含蟒功能调用,例如:在带有时间序列数据和分组的熊猫中使用指定

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 
相关问题