Как заменить серию логических значений на серию строк? - PullRequest
0 голосов
/ 05 июля 2018

Решением будет использование replace () дважды:

import pandas as pd
s = pd.Series([True, False, False])

s = s.replace(False, "A")
s = s.replace(True, 'B')

Тогда

Out[1]: 
0    B
1    A
2    A

Есть ли более элегантный способ сделать это?

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Вы можете использовать следующую команду, используя функцию .map ():

s = pd.Series([True, False, False])
s = s.map({True: 'A', False: 'B'})
print(s) 

или вы также можете попробовать другой способ, используя лямбда-функцию в .map ():

s = pd.Series([True, False, False])
s = s.map(lambda x: "A" if x else "B")        
print(s)
0 голосов
/ 05 июля 2018

Я бы сделал это с pandas.Series.apply:

>>> import pandas as pd
>>> s = pd.Series([True, False, False])
>>> s = s.apply(lambda x: 'B' if x else 'A')
>>> s
0    B
1    A
2    A
dtype: object
0 голосов
/ 05 июля 2018

Использование numpy.where:

s = np.where(s, 'B', 'A')

Это намного быстрее, чем map и apply, если вы кормите логическую серию:

s = pd.Series(np.random.choice([True, False], 1000000))

%%timeit
np.where(s, 'A','B')

4,43 мс ± 94,3 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 100 циклов в каждом)

mapper={True:'B',False:'A'}

%%timeit
s.map(mapper)

44,1 мс ± 178 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, по 10 циклов в каждом)

%%timeit
s.apply(lambda x: 'B' if x else 'A')

126 мс ± 4,51 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 10 циклов в каждом)

0 голосов
/ 05 июля 2018

Использование map

mapper={True:'B',False:'A'}
s = s.map(mapper)
s
Out[598]: 
0    B
1    A
2    A
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...