2015-07-21 52 views
2
追加bcolz列

让我们首先构造一个ctable与Blaze

import pandas as pd 
import blaze as bl 

df = pd.DataFrame({'x': range(4), 'y': [2., 4., 2., 4.]}) 
bl.odo(df, 'test.bcolz') 

现在假设我想了一个名为“x_mod”列添加到该表。我试图

test_table = bl.Data('test.bcolz') 

def f(h): 
    return h*3 
test_table['x_mod'] = test_table['x'].apply(f, dshape='int64') 
#Or, I think equivalently: 
#test_table['x_mod'] = test_table['x']*3 

但它给

TypeError: 'InteractiveSymbol' object does not support item assignment 

1)如何分配 'x_mod' 列,然后保存到磁盘? 我正在处理大型数据库:计算内存中的列应该没问题,但是我无法将整个ctable加载到内存中。

2)在相关问题上,apply也不适用于我。难道我做错了什么?

#This doesn't work: 
bl.compute(test_table['x'].apply(f, dshape='int64')) 

#This I think should be equivalent, but does work: 
bl.compute(test_table['x']*3) 

谢谢你的时间!

回答

1

您可以使用火焰的变换方法是这样的:

bz.transform(df, sepal_ratio = df.sepal_length/df.sepal_width ) 

对于其他功能,则需要使用火焰表达:

bz.transform(df, sepal_ratio = BLAZE_symbolic_Expression(df.Col1, df.col2) ) 

将计算列添加到数据帧。 文件是在这里: https://blaze.readthedocs.io/en/latest/expressions.html

例如,你可以使用地图:

from datetime import datetime 
yourexpr = df.col1.map(datetime.utcfromtimestamp) 
bz.transform(df, sepal_ratio=yourexpr) 
+0

感谢您的回答。你可以用一个(或多或少是任意的)函数'f'来完成这项工作吗?这是我的问题的核心 – cd98

+0

您需要使用Blaze表达式。意味着你需要将你的函数转换成Blaze表达式。 – Tensor

+0

这几乎回答了这个问题。你可以发布一个例子或两个特定的函数'f'用于在'bcolz'中创建一个新列吗?定义“f”的方式有多灵活?我会接受你的回答,谢谢! – cd98