Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过正则表达式操纵Pandas中的值_Python_Regex_Pandas_Dataframe - Fatal编程技术网

Python 通过正则表达式操纵Pandas中的值

Python 通过正则表达式操纵Pandas中的值,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,这实际上是一个后续问题。我之前的问题不清楚,既然已经回答了,我觉得还是发一个新问题好 我有一个如下所示的数据帧: Column1 Column2 Column3 Column4 Column5 5FQ 1.047 S$55.3 UG44.2 as of 02/Jun/2016 S$8.2 mm 600 (1.047) S$23.3 AG5.6 as of 02/Jun/20

这实际上是一个后续问题。我之前的问题不清楚,既然已经回答了,我觉得还是发一个新问题好

我有一个如下所示的数据帧:

Column1    Column2    Column3    Column4                     Column5
5FQ        1.047      S$55.3     UG44.2 as of 02/Jun/2016    S$8.2 mm
600        (1.047)    S$23.3     AG5.6 as of 02/Jun/2016     S$58 mm
KI2        1.695      S$5.35     RR59.5 as of 02/Jun/2016    S$705 mm
88G        0.0025     S$(5.3)    NW44.2 as of 02/Jun/2016    S$112 mm
60G        5.63       S$78.4     UG21.2 as of 02/Jun/2016    S$6.21 mm
90F        (5.562)    S$(88.3)   IG46.2 as of 02/Jun/2016    S$8 mm
我试图使用
regex
删除所有单词和字母,只保留数字。但是,如果数字包含在
()
中,我想将其改为负数

所需输出

Column1    Column2    Column3    Column4       Column5
5          1.047      55.3       44.2          8.2
600        -1.047     23.3       5.6           58
2          1.695      5.35       59.5          705
88         0.0025     -5.3       44.2          112
60         5.63       78.4       21.2          6.21
90         -5.562     -88.3      46.2          8
这可能吗?我尝试过使用这段代码,但不确定合适的
regex
组合应该是什么

df.apply(lambda x: x.astype(str).str.extract(r'(\d+\.?\d*)', expand=True).astype(np.float))

你可以想出:

import re

def onlynumbers(value):
    if value.startswith('('):
        return '-' + value
    rx = re.compile(r'\d+[\d.]*')
    try:
        return rx.search(value).group(0)
    except:
        return value

df.applymap(onlynumbers)
这将返回:


更新:
$1005a
-->
1005
(第1行第3列的示例)

旧答案:

另一种解决方案,仅使用方法:


你到底是怎么摆脱约会的?您应该首先删除该项,如我在下面的回答中所述。@chrisvp:No,我不应该-
rx.search()
只返回不是日期的第一个匹配项。好的,但是第5列是02,第6列是2016,只有第7列是8.2。所以你需要跳过5和6,这归结起来是为了消除日期。r'\d+[\d.]*'可能会短接到r'[\d.]+'不一定:请自己弄清楚(你的)、(我的)和更安全的之间的区别。有时缩短是为了不准确。当我的描述性答案被否决时,我会写一条评论:(\d+。?\d*)将所有数字与任意数量的小数匹配,包括日期的02和2016。此外,您缺少该标志。我会首先将所有的“(”(反斜杠)替换为“-”,然后删除所有日期格式的内容,然后删除(替换为零字符串)任何不是空格、数字或点的内容。类似于[^0-9.]*(您需要查找它,因为正则表达式的语法因环境而异。之后,您的结果由空格分隔,只需匹配(\d+。?\d*) ),结果是在组间。非常感谢!只是想知道,我注意到值之间是否有逗号,例如
$1005a
。它会删除除
1
之外的所有内容。有没有办法将其保持为
1005
?感谢这个最大值。我还想知道
列中是否有逗号值,例如:
$1005a
,此代码将删除所有内容,只保留值
1
。是否有方法修改代码,使其仅显示
1005
r1 = r'\((\d+\.?\d*)\)'
r2 = r'(-?\d+\.?\d*)'
df.stack().str.replace(r1, r'-\1', 1) \
          .str.extract(r2, expand=False).unstack()
In [131]: df
Out[131]:
  Column1  Column2   Column3                   Column4    Column5
0     5FQ    1.047   $1,005A  UG44.2 as of 02/Jun/2016   S$8.2 mm
1     600  (1.047)    S$23.3   AG5.6 as of 02/Jun/2016    S$58 mm
2     KI2    1.695    S$5.35  RR59.5 as of 02/Jun/2016   S$705 mm
3     88G   0.0025   S$(5.3)  NW44.2 as of 02/Jun/2016   S$112 mm
4     60G     5.63    S$78.4  UG21.2 as of 02/Jun/2016  S$6.21 mm
5     90F  (5.562)  S$(88.3)  IG46.2 as of 02/Jun/2016     S$8 mm

In [132]: to_replace = [r'\(([\d\.]+)\)', r'.*?([\d\.\,\-]+).*', ',']

In [133]: vals = [r'-\1', r'\1', '']

In [134]: df.replace(to_replace=to_replace, value=vals, regex=True)
Out[134]:
  Column1 Column2 Column3 Column4 Column5
0       5   1.047    1005    44.2     8.2
1     600  -1.047    23.3     5.6      58
2       2   1.695    5.35    59.5     705
3      88  0.0025    -5.3    44.2     112
4      60    5.63    78.4    21.2    6.21
5      90  -5.562   -88.3    46.2       8
In [28]: to_replace = [r'\(([\d\.]+)\)', r'.*?([\d\.-]+).*']

In [29]: vals = [r'-\1', r'\1']

In [30]: df.replace(to_replace=to_replace, value=vals, regex=True)
Out[30]:
  Column1 Column2 Column3 Column4 Column5
0       5   1.047    55.3    44.2     8.2
1     600  -1.047    23.3     5.6      58
2       2   1.695    5.35    59.5     705
3      88  0.0025    -5.3    44.2     112
4      60    5.63    78.4    21.2    6.21
5      90  -5.562   -88.3    46.2       8