想法是根据特定于每一列的值以最快的方式转换数据帧。
为简单起见,下面是一个示例,其中将列的每个元素与其所属列的平均值进行比较,如果大于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
这是一个玩具示例,但是解决方案必须应用于大数据帧,因此必须快速。
干杯!
最佳答案
您可以通过将每个元素与该列的均值进行比较来创建数据框的布尔掩码。使用以下方法可以轻松实现
df > df.mean()
0 1 2
0 False False False
1 True True True
由于True等于1,False等于0,因此可以使用astype将布尔数据帧轻松转换为整数。
(df > df.mean()).astype(int)
0 1 2
0 0 0 0
1 1 1 1
如果您需要输出为一些字符串而不是0和1,请使用np.where,它用作(条件,如果为true,则为else)
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
关于python - 如何通过map/apply在 Pandas 数据框上使用lambda函数,其中lambda为每一列取不同的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54373440/