Pandas DataFrame 除0外所有值替换为1

4 投票
3 回答
11781 浏览
提问于 2025-04-18 15:17

我有一个像下面这样的 pandas 数据框。

3,0,1,0,0
11,0,0,0,0
1,0,0,0,0
0,0,0,0,4
13,1,1,5,0

我需要把每隔一个的值替换成 '1',但 '0' 不变。所以我希望得到的结果是。

1,0,1,0,0
1,0,0,0,0
1,0,0,0,0
0,0,0,0,1
1,1,1,1,0

3 个回答

0

谢谢你,Marius。这个方法也可以只针对一列进行操作,当你想替换所有值,除了某一个值时。只要小心一点,这个操作是直接在原数据上进行的。

从第279列创建第280列,分类为 {1:正常, 0:心律失常}

df[280] = df[279]
df[280][df[280]!=1] = 0
0

作为一种不太常规的替代方案,可以考虑

%timeit (df/df == 1).astype(int)
1000 loops, best of 3: 449 µs per loop
%timeit df[df != 0] = 1
1000 loops, best of 3: 801 µs per loop

这里发生的事情简单来说就是:df/df 对于任何不等于 0 的值,结果都是 1,而对于 0 的值,结果会是 Inf(无穷大)。接着用 ==1 来检查,就能得到正确的矩阵,但这个结果是以二进制的形式呈现的,所以最后需要进行转换。

不过,随着数据框(dataframe)大小的增加,不需要选择而是直接对所有元素进行操作的优势就不明显了——最终这样做会变得效率低下。

11

你只需要用类似 df[df != 0] 这样的代码,就可以获取到你数据表中非零的部分:

import pandas as pd
import numpy as np
np.random.seed(123)

df = pd.DataFrame(np.random.randint(0, 10, (5, 5)), columns=list('abcde'))
df
Out[11]: 
   a  b  c  d  e
0  2  2  6  1  3
1  9  6  1  0  1
2  9  0  0  9  3
3  4  0  0  4  1
4  7  3  2  4  7

df[df != 0] = 1
df
Out[13]: 
   a  b  c  d  e
0  1  1  1  1  1
1  1  1  1  0  1
2  1  0  0  1  1
3  1  0  0  1  1
4  1  1  1  1  1

撰写回答