Python 熊猫-在数字前插入一个开/关括号或一个负号

Python 熊猫-在数字前插入一个开/关括号或一个负号,python,regex,pandas,Python,Regex,Pandas,我有一个列,其中的数据有时会缺少圆括号:所需的输出是要么删除大括号并在数字前引入负号,要么添加开始/结束大括号(如果缺少)。例如—“10752”至“-10752”或“(10752)” 输入- 0. 21,028 1. 11,689 2. 94 3. 10,572) 4. 2,261 名称:销售,数据类型:对象 所需输出 或者- 0. 21,028 1. 11,689 2. 94 3. (10,572) 4. 2,261 或 可能吗?或者,你可以把它看成这样

我有一个列,其中的数据有时会缺少圆括号:所需的输出是要么删除大括号并在数字前引入负号,要么添加开始/结束大括号(如果缺少)。例如—“10752”至“-10752”或“(10752)”

输入-

 0. 21,028 
 1. 11,689 
 2. 94 
 3. 10,572) 
 4. 2,261
名称:销售,数据类型:对象

所需输出

或者-

 0. 21,028 
 1. 11,689 
 2. 94 
 3. (10,572) 
 4. 2,261

可能吗?或者,你可以把它看成这样的字符串:

testz = '21,028 \n1    11,689 \n2        94 \n3    10,572) \n4     2,261 \n
要求的输出:

21,028 \n1    11,689 \n2        94 \n3    (10,572) \n4     2,261 \n

如您所见,“10572”替换为(10572)或-10572

现在我知道了如何一起删除括号-
re.sub(r'[()]',r'',testz)

但是要诱导一个或用负数替换这个数,我不知道怎么做

如果我添加新输入:

0.        80,123 
1.         5,060 
2.      (4,756 ) 
3.     ( 16,572) 
4.    ( 14,673 )
Name: sale , dtype: object

testz='80123\n15060\n2(4756)\n3(16572)\n4(14673)\n'

testz.replace(r'\((\d+(?:\.\d+))\b(?)\b(?您希望在任何数字之前添加一个
-
,该数字在左侧、右侧或两侧至少用一个括号括起来

使用基于交替的正则表达式:

df['testz'].str.replace(r'\(?\s*(\d+(?:,\d+)?)\s*\)|\(\s*(\d+(?:,\d+)?)\s*\)?', r'-\1\2')

详细信息

  • \(?\s*(\d+(?:,\d+)\s*\)
    -可选的
    ,0+空格,第1组:1+位数,后跟可选的
    和1+位数序列;然后是0+空格和
    字符
  • |
    -或
  • \(\s*(\d+(?:,\d+)\s*\)?
    -a
    字符,0+空格,第1组:1+位数,后跟可选的
    和1+位数序列;然后是0+空格和可选的
    字符

如果您需要括号来识别数字,为什么要删除括号?另外,如果您使用Pandas编写,请保留Pandas并显示适当的代码。我认为您需要类似于
df['col'].str.replace(r'\(\d+(?:\.\d+)\b(?!\)\124b的内容(?好的,为了区分它们,我需要完成括号或在数字前面加一个“-”负号,因为它们是负数..谢谢,我会尝试你提到的…:)str.replace(r'\(\d+(?:,\d+)\b(?),\d{3}\b)\b(?@WiktorStribiżew此代码适用于给定的输入,但只要我将输入更改为:testz='80123\n1 5060\n2(4756)\n3(16572)\n4(14673)\n它停止工作..你知道什么可能是错误的吗?让我们试着重新开始这个问题,我将投票。你能告诉我你是否可以使用PyPi正则表达式模块,或者你是否因为某些原因被限制在
re
?是的,谢谢你提供的详细信息,我不太擅长正则表达式,我现在可以更好地理解它了!!:)
0.        80,123 
1.         5,060 
2.      (4,756 ) 
3.     ( 16,572) 
4.    ( 14,673 )
Name: sale , dtype: object
testz = '80123 \n1    5,060 \n2        (4756) \n3    (16,572) \n4     (14,673) \n '
testz.replace(r'\((\d+(?:\.\d+)?)\b(?!\))|\b(?<!\()(\d+(?:\.\d+)?)\)', r'-\1\2')
df['testz'].str.replace(r'\(?\s*(\d+(?:,\d+)?)\s*\)|\(\s*(\d+(?:,\d+)?)\s*\)?', r'-\1\2')