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

Python 在数据帧中使用正则表达式将所有数字(0和1除外)更改为0,python,pandas,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

我将把数据帧列中除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
输出应该是这样的 这是数据帧的子集:

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

如果您的输入是数字,您可以
映射
值,使
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()

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

df2['AgDg'].where(df2['AgDg'] == 1, 0, True)
为了更清楚一点,还可以命名in参数(我建议,当使用比最常见的参数更多的参数来提高可读性时):

让我们使用and
ne
。我们在所有非一个值上放置一个掩码:

df.assign(value=df.value.mask(df.value.ne(1),0))
或者像泰德·佩特罗建议的那样

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

为什么不
df2['AgDg']。其中(df2['AgDg']=='1','0')
?您有str类型的列吗?数字是否嵌入其他字符串中?您的条目是整数还是字符串?它们是整数。如果它们是字符串和整数的组合,我该如何处理?@psidom,因此您的代码将替换除0和1到0之外的所有数字?代码将替换列中所有非
“1”的值
“0”
;由于
“0”
已经是
“0”
,所以逻辑上它与您需要的是一样的。如果您有整数,则使用数字
df2['AgDg']。其中(df2['AgDg']==1,0)
@Johanl,谢谢,我仍然不明白第二种解决方案是如何工作的。你能解释一下吗?我补充了一些解释。我希望这能让它更清楚?或者
df.value.eq(1).mul(1)
。哪一种更快?@TedPetrou是的,速度几乎是原来的两倍。我喜欢。