数列的条件乘法

2024-03-28 14:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫系列,包含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])

但是第二种方法要慢得多,我想知道是否有更好的方法来处理这个案子。你知道吗


Tags: 方法inltforifmy数字else
1条回答
网友
1楼 · 发布于 2024-03-28 14:35:42

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

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

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

相关问题 更多 >