按SFrame列记录值

时间:2014-11-19 09:37:51

标签: pandas dataframe logarithm

请有人告诉我,如何从SFrame,graphlab(或DataFrame,pandas)列中的每个值中取对数,而不是遍历SFrame列的整个长度? 我特别关注类似的功能,例如Groupby Aggregators用于日志功能。找不到自己......

重要提示:请不要对列的整个长度for-loop迭代感兴趣。我只对特定函数感兴趣,它将所有值转换为整列的日志值。

如果此功能在手册中,我也很抱歉。请给我一个链接......

3 个答案:

答案 0 :(得分:5)

numpy提供了大量基本数学变换的实现。您可以在基于numpy的ndarray构建的所有数据结构上使用这些结构。

import pandas as pd
import numpy as np
data = pd.Series([np.exp(1), np.exp(2), np.exp(3)])
np.log(data)

输出:

0    1
1    2
2    3
dtype: float64

此示例适用于pandas数据类型,但适用于所有基于numpy数组的数据结构。

答案 1 :(得分:4)

相同的“apply”模式也适用于SFrame。你可以这样做:

drop PROCEDURE if  EXISTS big_data;
CREATE PROCEDURE big_data()
BEGIN
    DECLARE total_count TEXT DEFAULT '';
    DECLARE i int DEFAULT 1;
    WHILE i <= 10000000 DO
        SET total_count = total_count + '(' + i+ ', name, 34),';
        SET i = i + 1;
    END WHILE;
    SET total_count = TRIM(TRAILING ',' FROM total_count);
    INSERT INTO test(id, name, age) VALUES ' + total_count;
END;

答案 2 :(得分:-1)

<强> @cel

我认为,就我而言,也可以使用下一个模式。

import numpy
import pandas
import graphlab


df
    a b c 
    1 1 1 
    1 2 3
    2 1 3
    ....

df['log c'] = df.groupby('a')['c'].apply(lambda x: numpy.log(x))
对于SFrame(sf而不是df对象),它可能看起来有点不同

logvals = numpy.log(sf['c'])
log_sf = graphlab.SFrame(logvals)
sf = sf.join(log_sf, how = 'outer')

可能numpy代码片段有点长,但它有效......

主要问题当然是时间性能。我确实希望,我可以找到一些特定的功能来减少我的时间....