使用pandas数据帧中的正则表达式将所有数字(0和1除外)更改为0

时间:2017-06-26 21:30:45

标签: python pandas

我要在数据帧列中将除1和0之外的任何数字更改为0。这是我的代码。但它不起作用。

df2['AgDg'] = df2['AgDg'].replace(r'\[2-9]\d*', 0, regex=True)

这是数据框的子集:

Index   value 
1        0
2        45
3        135
4        1
5        1

输出应该是这样的 这是数据框的子集:

  Index   value 
    1        0
    2        0
    3        0
    4        1
    5        1

2 个答案:

答案 0 :(得分:1)

如果您的输入是数字,则可以map值,以便1变为1,所有其他值0。为此,我使用了lambda(内联)函数:

df2['AgDg'] = df2['AgDg'].map(lambda val:1 if val == 1 else 0)

这会将您的值转换为整数,无论​​它们是什么数字。否则,您也可以使用评论中的where函数:

df2['AgDg'] = df2['AgDg'].where(df2['AgDg'] == 1, 0)

where()选择并保留满足要求的元素(即,在这种情况下等于1。第二个参数是分配给不满足要求的元素的值(即,设置全部其他元素为“0”。

在这种情况下,当我们更新当前数据框时,也可以“就地”进行,这意味着我们直接更新当前数据,而不是分配。然后命令变为:

df2['AgDg'].where(df2['AgDg'] == 1, 0, True)

为了使它更清楚,也可以命名in参数(我建议,当使用多于最常见的参数来提高可读性时):

df2['AgDg'].where(df2['AgDg'] == 1, other=0, inplace=True)

答案 1 :(得分:1)

让我们使用maskne。我们正在掩盖所有非一个值:

df.assign(value=df.value.mask(df.value.ne(1),0))

或Ted Petrou建议

df.assign(value=df.value.eq(1).mul(1))

输出:

   Index  value
0      1      0
1      2      0
2      3      0
3      4      1
4      5      1