如何将条件传递给lambda函数?

2024-05-12 22:08:52 发布

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

我有一本这样的字典:

Dict={'A':0.0697,'B':0.1136,'C':0.2227,'D':0.2725,'E':0.4555} 

我希望我的输出是这样的: 如果我的数据帧中的值小于0.0697,0.1136,0.2227,0.2725,0.4555,则返回A,B,C,D,E;否则返回F

我试过:

TrainTest['saga1'] = TrainTest['saga'].apply(lambda x,v: Dict[x] if x<=v else 'F')

但它返回一个错误:

TypeError: <lambda>() takes exactly 2 arguments (1 given)

Tags: 数据lambdaif字典错误argumentselsedict
2条回答

让我们做一些测试数据:

saga = pd.Series([0.1, 0.2, 0.3, 0.4, 0.5, 0.9])

接下来,认识到Dict是一个dict并且没有顺序,所以让我们按照数字的相反顺序来排序:

thresh = sorted(Dict.items(), key=lambda t: t[1], reverse=True)

最后,解决问题的方法不是在saga上循环,而是在thresh上循环,因为Python/Pandas中的循环(和apply())很慢,我们假设sagathresh长得多:

result = pd.Series('F', saga.index) # all F's to start
for name, value in thresh:
    result[saga < value] = name

现在result是一系列值a,B,C,D,E,F,我们按相反的顺序循环,因为例如0比所有的值都小,应该标记为a,而不是E

关于运行时间:

In [160]:%%timeit
# loop over smaller thresh, not << saga
for name, value in thresh:
    result[saga < value] = name
100 loops, best of 3: 2.59 ms per loop

以下是熊猫的运行时间:

 saga1 = pd.DataFrame([0.05,0.1, 0.2, 0.3, 0.4, 0.5, 0.9],columns=['c1'])
 def mapF(s):
     # descending 
     curr='F'
     for name, value in thresh:
         if s < value:
             curr = name
     return curr

使用映射/应用:

In [149]: %%timeit
saga1['result'] = saga1['c1'].map(lambda x: mapF(x) )
1000 loops, best of 3: 311 µs per loop

使用矢量化:

In [166]:%%timeit
import numpy as np
saga1['result'] = np.vectorize(mapF)(saga1['c1'])
1000 loops, best of 3: 244 µs per loop

** saga1 
+ -+   +    +
|   |  c1  | result |
+ -+   +    +
| 0 | 0.05 |   A    |
| 1 | 0.1  |   B    |
| 2 | 0.2  |   C    |
| 3 | 0.3  |   E    |
| 4 | 0.4  |   E    |
| 5 | 0.5  |   F    |
| 6 | 0.9  |   F    |
+ -+   +    +

相关问题 更多 >