Python pandas:使用DataFrame.replace函数,函数作为值

时间:2015-09-15 21:04:03

标签: python pandas

使用Python pandas,我一直在尝试使用一个函数,作为pandas.DataFrame的一些替换值之一(即其中一个替换本身应该是函数调用的结果)。我的理解是,pandas.DataFrame.replacere.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)。

1 个答案:

答案 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)