我有一个看起来像这样的数据集:
id col1 col2 col3
123 10 0 82
456 0 90 16
987 0 0 0
我想在列中替换所有非ID中的所有非零值。
我尝试过:
df.col1 = df.where(df.col1 != 0, 1)
,但这用1 s替换为1S,用ID代替零。
然后我尝试将新的DF设置为此功能:
df2 = df.col1 = df.where(df.col1 != 0, 1)
和可行的,除了它将ID列更改为1,其中它将非零值更改为1。
对无法工作或其他方法的代码进行故障排除将不胜感激!
选项1
astype
df
col1 col2 col3
id
123 10 0 82
456 0 90 16
987 0 0 0
df.astype(bool).astype(int)
col1 col2 col3
id
123 1 0 1
456 0 1 1
987 0 0 0
或使用gt
创建掩码:
df.gt(0).astype(int)
col1 col2 col3
id
123 1 0 1
456 0 1 1
987 0 0 0
如果 id
不是索引,首先设置!:
df = df.set_index('id')
选项2
mask
df.mask(df > 0, 1)
col1 col2 col3
id
123 1 0 1
456 0 1 1
987 0 0 0
选项3
df.where
(请注意与您的方法的区别)
df.where(df == 0, 1)
col1 col2 col3
id
123 1 0 1
456 0 1 1
987 0 0 0
使用np.where
的类似解决方案:
pd.DataFrame(np.where(df > 0, 1, 0), index=df.index, columns=df.columns)
col1 col2 col3
id
123 1 0 1
456 0 1 1
987 0 0 0