如何用一系列字符串替换一系列布尔值?

时间:2018-07-05 17:35:49

标签: python pandas

一种解决方案是两次使用 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 :(得分:5)

使用numpy.where

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

如果要输入布尔序列,这比mapapply快得多:

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

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

每个循环4.43 ms±94.3 µs(平均±标准偏差,共运行7次,每个循环100个循环)

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

%%timeit
s.map(mapper)

每个循环44.1 ms±178 µs(平均±标准偏差,共运行7次,每个循环10个循环)

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

每个循环126 ms±4.51 ms(平均±标准偏差,共运行7次,每个循环10个循环)

答案 1 :(得分:3)

使用SELECT T.STOCK_DATE, I.ITEM_BARCODE, I.ITEM_NAME, SUM(T.STOCK_QUANTITY) - SUM(S.SALES_QUANTITY) AS QUANTITY FROM ITEMS I INNER JOIN STOCKS T ON I.ITEM_ID = T.ITEM_ID LEFT JOIN SALES S ON I.ITEM_ID = S.ITEM_ID GROUP BY I.ITEM_BARCODE, T.STOCK_DATE, I.ITEM_NAME ORDER BY T.STOCK_DATE;

map

答案 2 :(得分:1)

我会用pandas.Series.apply来做到这一点:

mapper={True:'B',False:'A'}
s = s.map(mapper)
s
Out[598]: 
0    B
1    A
2    A
dtype: object

答案 3 :(得分:1)

您可以通过.map()函数使用以下命令:

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

或者您也可以在.map()函数下使用lambda函数尝试另一种方式:

s = pd.Series([True, False, False])
s = s.map(lambda x: "A" if x else "B")        
print(s)