Skip to main content
 首页 » 编程设计

python之如何通过 map/apply 在 pandas 数据框上使用 lambda 函数,其中 lambda 对每一列取不同的值

2025年05月04日26zengkefu

这个想法是根据每一列的特定值以最快的方式转换数据框。 为简单起见,这里是一个示例,其中将列的每个元素与其所属列的平均值进行比较,如果大于 mean(column) 则替换为 0,否则替换为 1。

In [26]: df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))                                                                                                                                                                
 
In [27]: df                                                                                                                                                                                                                 
Out[27]:  
   0  1  2 
0  1  2  3 
1  4  5  6 
 
In [28]: df.mean().values.tolist()                                                                                                                                                                                          
Out[28]: [2.5, 3.5, 4.5] 

下面的代码段,它不是真正的代码,而是更多地举例说明所需的行为。我使用了 apply 方法,但它可以是最快的方法。

In [29]: f = lambda x: 0 if x < means else 1                                                                                                                                                                                
 
In [30]: df.apply(f) 
 
In [27]: df                                                                                                                                                                                                                 
Out[27]:  
   0  1  2 
0  0  0  0 
1  1  1  1  

这是一个玩具示例,但解决方案必须应用于大数据框架,因此,它必须很快。

干杯!

请您参考如下方法:

您可以通过将每个元素与该列的平均值进行比较来创建数据框的 bool 掩码。使用

可以轻松实现
df > df.mean() 
 
    0       1       2 
0   False   False   False 
1   True    True    True 

由于 True 等于 1,False 等于 0,因此可以使用 astype 轻松地将 bool 数据框转换为整数。

(df > df.mean()).astype(int) 
 
    0   1   2 
0   0   0   0 
1   1   1   1 

如果您需要输出一些字符串而不是 0 和 1,请使用 np.where,它的作用是(条件,如果为真,否则)

pd.DataFrame(np.where(df > df.mean(), 'm', 'n')) 
 
    0   1   2 
0   n   n   n 
1   m   m   m 

编辑:在评论中解决 qn;如果 m 和 n 是列相关的怎么办

df = pd.DataFrame(np.arange(12).reshape(4,3)) 
 
    0   1   2 
0   0   1   2 
1   3   4   5 
2   6   7   8 
3   9   10  11 
 
pd.DataFrame(np.where(df > df.mean(), df.min(), df.max())) 
 
    0   1   2 
0   9   10  11 
1   9   10  11 
2   0   1   2 
3   0   1   2