我有一个大熊猫系列,其中包含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
然而第二种方式慢得多,我想知道是否有更好的方法来处理这种情况。
答案 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
除非我在这里做错了什么(有人吗?),看来至少对于这个例子来说自我矢量化的版本要快一点。