簡體   English   中英

熊貓系列的條件乘法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM