如何通过map/apply在pandas数据框架上使用lambda函数,其中lambda为每列采用不同的值

fla*_*nco 1 python numpy pandas

我们的想法是根据每列特定的值以最快的方式转换数据帧.为简单起见,这里是一个示例,其中列的每个元素与它所属的列的平均值进行比较,如果大于mean(列)则替换为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]
Run Code Online (Sandbox Code Playgroud)

Snippet bellow,它不是真正的代码,而是更多的例证所需的行为.我使用的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 
Run Code Online (Sandbox Code Playgroud)

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

干杯!

Vai*_*ali 5

您可以通过将每个元素与该列的平均值进行比较来创建数据框的布尔掩码.它可以很容易地实现使用

df > df.mean()

    0       1       2
0   False   False   False
1   True    True    True
Run Code Online (Sandbox Code Playgroud)

由于True等于1而False为0,因此可以使用astype轻松地将布尔数据帧转换为整数.

(df > df.mean()).astype(int)

    0   1   2
0   0   0   0
1   1   1   1
Run Code Online (Sandbox Code Playgroud)

如果你需要输出是一些字符串而不是0和1,请使用np.where作为(condition,如果为true,否则)

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

    0   1   2
0   n   n   n
1   m   m   m
Run Code Online (Sandbox Code Playgroud)

编辑:在评论中解决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
Run Code Online (Sandbox Code Playgroud)