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