Pandas DataFrame 除0外所有值替换为1
我有一个像下面这样的 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