Pandas 基于元素的if/else(IIF)

Pandas 基于元素的if/else(IIF),pandas,Pandas,熊猫中是否有元素级IIF功能 例如,给定一个数据帧: w = pd.DataFrame({'Date':pd.to_datetime(['2016-01-01','2016-01-02','2016-01-03']),'A1':[0.3,0.1,0.1],'A2':[0.4,0.4,0.4]}).set_index(['Date']) 如果元素>0.2,则设置为1,否则设置为0。例如: w2 = pd.DataFrame({'Date':pd.to_datetime(['2016-01-0

熊猫中是否有元素级IIF功能

例如,给定一个数据帧:

w = pd.DataFrame({'Date':pd.to_datetime(['2016-01-01','2016-01-02','2016-01-03']),'A1':[0.3,0.1,0.1],'A2':[0.4,0.4,0.4]}).set_index(['Date'])  
如果元素>0.2,则设置为1,否则设置为0。例如:

w2 = pd.DataFrame({'Date':pd.to_datetime(['2016-01-01','2016-01-02','2016-01-03']),'A1':[1,0,0],'A2':[1,1,1]}).set_index(['Date'])  

有mask()/where(),但真实值来自旧数据帧

您需要将
0.2
boolean数据帧
转换为
np.uint8

print (w > .2)
               A1    A2
Date                   
2016-01-01   True  True
2016-01-02  False  True
2016-01-03  False  True

w1 = (w > .2).astype(np.uint8)
print (w1)
            A1  A2
Date              
2016-01-01   1   1
2016-01-02   0   1
2016-01-03   0   1

比较解决方案:

#[300000 rows x 2 columns]
#for testing index is not necessary
w = pd.concat([w]*100000).reset_index(drop=True)

In [49]: %timeit ((w > .2).astype(int))
100 loops, best of 3: 2.11 ms per loop

In [50]: %timeit ((w > .2).astype(np.short))
1000 loops, best of 3: 1.8 ms per loop

In [51]: %timeit ((w > .2).astype(np.uint8))
1000 loops, best of 3: 1.35 ms per loop

In [82]: %timeit (w.gt(.2).astype(np.uint8))
1000 loops, best of 3: 1.02 ms per loop

In [52]: %timeit (w.applymap(lambda x: 1 if x>0.2 else 0))
1 loop, best of 3: 334 ms per loop
感谢您提供另一个解决方案:

pd.DataFrame((w.values > .2).astype(np.uint8), w.index, w.columns)


In [112]: %timeit (pd.DataFrame((w.values > .2).astype(np.uint8), w.index, w.columns))
1000 loops, best of 3: 877 µs per loop

您需要将
0.2
boolean数据帧
转换为
np.uint8

print (w > .2)
               A1    A2
Date                   
2016-01-01   True  True
2016-01-02  False  True
2016-01-03  False  True

w1 = (w > .2).astype(np.uint8)
print (w1)
            A1  A2
Date              
2016-01-01   1   1
2016-01-02   0   1
2016-01-03   0   1

比较解决方案:

#[300000 rows x 2 columns]
#for testing index is not necessary
w = pd.concat([w]*100000).reset_index(drop=True)

In [49]: %timeit ((w > .2).astype(int))
100 loops, best of 3: 2.11 ms per loop

In [50]: %timeit ((w > .2).astype(np.short))
1000 loops, best of 3: 1.8 ms per loop

In [51]: %timeit ((w > .2).astype(np.uint8))
1000 loops, best of 3: 1.35 ms per loop

In [82]: %timeit (w.gt(.2).astype(np.uint8))
1000 loops, best of 3: 1.02 ms per loop

In [52]: %timeit (w.applymap(lambda x: 1 if x>0.2 else 0))
1 loop, best of 3: 334 ms per loop
感谢您提供另一个解决方案:

pd.DataFrame((w.values > .2).astype(np.uint8), w.index, w.columns)


In [112]: %timeit (pd.DataFrame((w.values > .2).astype(np.uint8), w.index, w.columns))
1000 loops, best of 3: 877 µs per loop
答案是我会用什么来解决这个问题。
或者,您也可以使用函数

w.applymap(lambda x: 1 if x>0.2 else 0)
答案是我会用什么来解决这个问题。
或者,您也可以使用函数

w.applymap(lambda x: 1 if x>0.2 else 0)

也许你可以从你的问题中添加期望的结果也许你可以从你的问题中添加期望的结果question@piRSquared-谢谢。@piRSquared-我也要检查你的解决方案;)不,只需将此项添加到您的列表
pd.DataFrame((w.values>.2).astype(np.uint8),w.index,w.columns)
@piRSquared-谢谢。@piRSquared-我也要检查您的解决方案;)不,只需将这个添加到您的列表
pd.DataFrame((w.values>.2).astype(np.uint8)、w.index、w.columns)