我正试图为现有的熊猫数据框架mydf指定一个新的专栏。要添加的系列是计算作为字符串传递的表达式的结果。例如,表达式可以包含python函数调用:
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发布于 2016-11-15 23:49:35
您所遇到的问题之一是,公式硬编码DataFrame来应用它,即mydf。
不管怎么说,有件事应该管用的。我无法找到一种方法不创建另一个dataframe,但是如果您的数据集不是非常大,那么它就不会有多大了。
我重写了这个公式,以接受要应用它的数据格式的字符串格式。
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.11https://stackoverflow.com/questions/40621005
复制相似问题