我有一个像下面这样的pandas DataFrame。
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
我需要将除了'0'之外的所有其他值替换为'1'。所以我的预期输出。
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
答案 0 :(得分:6)
只需使用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
答案 1 :(得分: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
为1
提供了0
以外的任何值Inf
,==1
。检查{{1}}会给出正确的矩阵,但是采用二进制形式 - 因此最后会进行转换。
然而,随着数据帧大小的增加,不必选择但只是对所有元素进行操作的优势变得无关紧要 - 最终你效率会降低。