使用Python pandas,我一直在尝试使用一个函数,作为pandas.DataFrame
的一些替换值之一(即其中一个替换本身应该是函数调用的结果)。我的理解是,pandas.DataFrame.replace
在re.sub
内部委托,并且只要pandas.DataFrame.replace
参数设置为regex
,任何与其一起使用的内容都应该与True
一起使用}。
因此,我在堆栈溢出上提供了elsewhere提供的指导,但与re.sub
有关,并尝试将其应用于pandas.DataFrame.replace
(使用替换为regex=True, inplace=True
和 to_replace
设置为嵌套字典,如果指定特定列,或者根据其documentation指定为两个列表。我的代码在不使用函数调用的情况下工作正常,但如果我尝试将函数作为替换值之一提供,则会失败,尽管这样做的方式与re.sub
(已经过测试,并且正常工作)相同。我意识到该函数应该接受匹配对象作为其唯一必需参数并返回一个字符串。
而不是具有函数调用的结果的结果DataFrame
,它包含函数本身(即作为第一类,未参数化的对象) )。
为什么会发生这种情况?如何才能使其正常工作(返回并存储功能的结果)?如果这是不可能的,我会很感激,如果一个可行的" Pandasonic"可以提出替代方案。
我提供了以下示例:
def fn(match):
id = match.group(1)
result = None
with open(file_name, 'r') as file:
for line in file:
if 'string' in line:
result = line.split()[-1]
return (result or id)
data.replace(to_replace={'col1': {'string': fn}},
regex=True, inplace=True)
上述方法不起作用,因为它取代了正确的搜索字符串,但将其替换为:
<function fn at 0x3ad4398>
对于上述(人为的)示例,预期输出将是&#34; string&#34;的所有值。在col1
中替换fn
返回的字符串。
但是,import re; print(re.sub('string', fn, 'test string'))
按预期工作(以及previously depicted)。
答案 0 :(得分:2)
我当前的解决方案(看起来次优, ad hoc 给我)如下(省略号表示不相关的附加代码,已被省略;使用的具体数据是设计的):
def _fn(match):
...
return ...
def _multiple_replace(text, repl_dictionary):
"""Adapted from: http://stackoverflow.com/a/15175239
Returns the result for the first regex that matches
the provided text."""
for pattern in repl_dictionary.keys():
regex = re.compile(pattern)
res, num_subs = regex.subn(repl_dictionary[pattern], text)
if num_subs > 0:
break
return res
repl_dict = {'ABC.*(\w\w\w)': _fn, 'XYZ': 'replacement_string'}
data['col1'] = data['col1'].apply(_multiple_replace,
repl_dictionary=repl_dict)