Условное умножение серии Панд - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть серия панд, которая содержит числа от 0 до 1. Если число <0,5, мне нужно умножить его на 10, в противном случае умножить на 20. </p>

Я могу сделать что-то подобное, чтобы умножитьвсе на 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])

Однако второй способ намного медленнее, и мне было интересноесть ли лучший способ справиться с этим делом.

1 Ответ

0 голосов
/ 25 апреля 2018

Я новичок в пандах, так что это может быть не самый эффективный ответ, но я выкину его там, потому что он, кажется, работает:

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

Если я не сделал что-то здесь не так (кто-нибудь?), Похоже, что, по крайней мере, для этого примера версия с векторизацией немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...