将函数多次迭代应用于熊猫系列的最佳方法

时间:2020-11-03 16:47:26

标签: python pandas

我需要将带有条件的文本替换应用于具有许多不同迭代的熊猫系列。最好的方法是什么?

虽然我首先要定义一个函数,然后在函数中进行迭代,然后再应用该函数,但是由于每行仅返回一个值(仅用于第一次迭代),因此这显然将不起作用:

Frame rootFrame = Window.Current.Content as Frame;
rootFrame?.Navigate(typeof(MainPage));

我的另一个想法是在apply语句之外定义一个列表,遍历字典键列表,然后将该函数应用于具有list元素的行,但是,我不确定如何应用系列的多参数函数,并指定哪个参数是系列的“行”参数。

def numberreplace(x):
    matches = {'FIRST':'1ST',
               'SECOND':'2ND',
               'THIRD':'3RD',
               'FOURTH':'4TH',
               'FIFTH':'5TH',
               'SIXTH':'6TH',
               'SEVENTH':'7TH',
               'EIGTH':'8TH',
               'NINTH':'9TH',
               'TENTH':'10TH'}
    for key in matches.keys():
        if (' '+key+'' in x) or (x.startswith(key)):
            x = x.replace(key, matches[key])
            return x
        else:
            return x
data['STREET REFORMAT'] = data['STREET REFORMAT'].apply(numberreplace)

在具有许多行和许多替换字符串的数据帧上运行此apply函数的最有效方法是什么?

3 个答案:

答案 0 :(得分:2)

您不需要在for循环内返回x,只需在循环结束后返回一次即可。试试这个:

def numberreplace(x):
    matches = {'FIRST':'1ST',
               'SECOND':'2ND',
               'THIRD':'3RD',
               'FOURTH':'4TH',
               'FIFTH':'5TH',
               'SIXTH':'6TH',
               'SEVENTH':'7TH',
               'EIGTH':'8TH',
               'NINTH':'9TH',
               'TENTH':'10TH'}
    for key in matches.keys():
        if (' '+key+'' in x) or (x.startswith(key)):
            x = x.replace(key, matches[key])
    return x
data['STREET REFORMAT'] = data['STREET REFORMAT'].apply(numberreplace)

答案 1 :(得分:1)

重写函数的一种方法是使用正则表达式:

import re
def numberreplace(x):
    matches = {'FIRST':'1ST',
               'SECOND':'2ND',
               'THIRD':'3RD',
               'FOURTH':'4TH',
               'FIFTH':'5TH',
               'SIXTH':'6TH',
               'SEVENTH':'7TH',
               'EIGTH':'8TH',
               'NINTH':'9TH',
               'TENTH':'10TH'}
    for key in matches.keys():
        x = re.sub(re.compile(f"\s*{key}"), matches[key], x)
    return x
data['STREET REFORMAT'] = data['STREET REFORMAT'].apply(numberreplace)

这将用等效的keys替换所有出现的matches,如果找不到匹配项,则返回原始字符串。该解决方案比使用string.replace()方法的解决方案快大约2倍,因此对于具有许多行和许多替换字符串的大型数据框而言,它可能很有用。

答案 2 :(得分:0)

除了循环之外,您还可以创建两个条件并使用字典mask来创建matches

data = pd.DataFrame({"STREET REFORMAT":["FIRST", "THIRD", "IAMNINTH", "EIGTHISME"]})

cond1 = data["STREET REFORMAT"].str.contains("|".join(fr"\b{i}\b" for i in matches))
cond2 = data["STREET REFORMAT"].str.contains("|".join(fr"^{i}" for i in matches))

print (data["STREET REFORMAT"].mask(cond1|cond2, data["STREET REFORMAT"].replace(matches, regex=True)))

0         1ST
1         3RD
2    IAMNINTH
3     8THISME
Name: STREET REFORMAT, dtype: object