[英]Conditional multiplication of Pandas Series
我有一個熊貓系列,其中包含0到1之間的數字。如果數字<0.5,我需要將其乘以10,否則將其乘以20。
我可以做這樣的事情將所有內容乘以20。
outcome = 20 * my_series
我可以遍歷整個系列,像這樣一個接一個地做:
for i, v in my_series.iteritems():
if v >= 0.5:
mul = 20
else:
mul = 10
outcome.append(mul * my_series[i])
但是第二種方法要慢得多,我想知道是否有更好的方法來處理這種情況。
我是熊貓的新手,所以這可能不是最有效的答案,但我將它扔掉了,因為它似乎有效:
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)
更新
出於好奇,我嘗試了上述方法的快速timeit測試,並對結果感到有些驚訝:
>>> 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
除非我在這里做錯了什么(有人嗎?),否則看來至少對於本示例而言,自矢量化版本要快一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.