1
HelloViper 2021-03-29 12:14:21 +08:00
axis=1,横向 apply,每个切片是一个 series,直接遍历了正则提取最后 join 就可以了
|
2
badacook OP @HelloViper 我说了要保持 DataFrame layout,那 不包含括号的,这个 python 里的 if 返回值为 bool 值的 判断条件 我写不出来,还有就是 我想看看 有没有简便的方法
|
3
reself 2021-03-29 13:22:27 +08:00
mapper = lambda x: ''.join(re.findall(r, x)) or x
df_new = df.applymap(mapper) |
6
Gatsbywl 2021-03-29 13:33:03 +08:00
def getString(s):
pattern = r'[(](.*?)[)]' reString = re.compile(pattern, re.S) tmpString = re.findall(reString, s) return tmpString[0] if tmpString else s df.applymap(getString) =================================== 或者一行,易读性不好: df.applymap(lambda s:re.findall(re.compile(r'[(](.*?)[)]', re.S), s)[0] if re.findall(re.compile(r'[(](.*?)[)]', re.S), s) else s) |
7
badacook OP @reself 非常感谢 你的指点,这里面 lambda 'or' 咋这么厉害,居然实现了一个 if 分支的 else 输出,太感谢了
|
9
HelloViper 2021-03-29 15:14:27 +08:00
@badacook or 是取第一个有值的,这样比较优雅;也可以 lambda x: ''.join(re.findall(r, x)) if re.findall(r, x) else x;
另外好像 str 列内置了正则,Series.str.findall |
10
imn1 2021-03-29 15:23:14 +08:00
不需要 lambda,pandas 的 str.replace 支持正则的,而且是跟 re 模块相同语法
|
11
badacook OP @imn1 我最先看的就是 str.replace,但这个 既不是全部替,也不是部分替换,是 若含有(),保留()内部内容,这个 replace,我写不出来,而且 想在 df.applymap 类似函数体内完成,判断就寄 希望与 lambda 的判断分支了
|
12
badacook OP @HelloViper 还有一点 使用最后的 df.applymap() 条件处理时,需要先将 DataFrame 中非字符数据列 全部转换成 字符处理,df = df.applymap(str),这个好像 也只能是这样了,有点儿失真
|
13
imn1 2021-03-29 17:05:17 +08:00
@badacook #11
只能说你的正则没写对,replace 本来就是匹配才替换,不匹配不替换的 "abc".replace("aaa", ""),你觉得结果会是空字串么? 如果你测试得到了全部都替换了的结果,就是正则匹配写错了 DataFrame.replace(to_replace=匹配的正则, value=替换的正则, regex=True) |
14
badacook OP @imn1 这不是 写不出这个正则嘛 字符串,含有()就保留()里面的内容,要是写得出这个正则, 我也提前看过了 那个 replace 函数了 也不会在这里请教大家了
|
15
imn1 2021-03-29 17:32:24 +08:00
|
17
badacook OP @HelloViper
@reself @Gatsbywl imn1 大神用一行正则 直接实现了,df = df.replace(r'[^()]*\(([^()]+)\)[^()]*', value=r'\1', regex=True) 包含括号,就将内容替换为括号里面的内容,太厉害了 |