Pandas系列的条件乘法

时间:2018-04-25 18:14:44

标签: python pandas

我有一个大熊猫系列,其中包含0到1之间的数字。如果数字是< 0.5我需要将它乘以10,否则乘以20。

我可以做这样的事情,把所有东西都乘以20。

for i, v in my_series.iteritems():
    if v >= 0.5:
        mul = 20
    else:
        mul = 10
    outcome.append(mul * my_series[i])

我可以遍历整个系列,然后像这样逐一进行:

 select count(*) from (SELECT value,
           Timestamp,
           value- LAG(value, 1, 0) OVER (ORDER BY TimeStamp) AS value_diff
    FROM   table)a
    where value_diff>=2

然而第二种方式慢得多,我想知道是否有更好的方法来处理这种情况。

1 个答案:

答案 0 :(得分:1)

我是熊猫的新手,所以这可能不是最有效的答案,但我会把它扔出去,因为它似乎有效:

pandas.Series.where(my_series*10, cond=my_series<0.5, other=my_series*20)

使用不同的版本,我也提出了以下内容,但我假设上面的内容效率更高,因为它内置了。

到位版本:

my_series[my_series>=0.5] *= 20
my_series[my_series<0.5] *= 10

在行版本中:

(my_series < 0.5)*(my_series*10) + (my_series >=0.5)*(my_series*20)

<强>更新

出于好奇,我尝试了上述的快速测试,并对结果感到有些惊讶:

>>> setup = """
... import random, pandas
... random.seed=('skdfjaiswe')
... my_series = pandas.Series([random.random() for idx in range(1000)])
... """
>>> print min(timeit.Timer("pandas.Series.where(my_series*10, cond=my_series<0.5, other=my_series*20)", setup=setup).repeat(7, 1000))
0.758988142014
>>> print min(timeit.Timer("my_series[my_series>=0.5] *= 20; my_series[my_series<0.5] *= 10", setup=setup).repeat(7, 1000))
9.13403320312
>>> print min(timeit.Timer("(my_series < 0.5)*(my_series*10) + (my_series >=0.5)*(my_series*20)", setup=setup).repeat(7, 1000))
0.612030029297

除非我在这里做错了什么(有人吗?),看来至少对于这个例子来说自我矢量化的版本要快一点。