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

Python 对熊猫系列应用多次迭代函数的最佳方法,python,pandas,Python,Pandas,我需要对具有许多不同迭代的pandas系列应用带条件的文本替换。实现这一目标的最佳方式是什么 我的第一个想法是定义一个函数,在函数中迭代,然后应用它,但是这显然不起作用,因为每行只返回一个值(仅第一次迭代): 我的另一个想法是在apply语句之外定义一个列表,迭代字典键列表,然后使用list元素将函数应用于行,但是,我不确定如何将多参数函数应用于一个系列,以及指定哪个参数是该系列的“row”参数 def numberreplace(row,k): matches = {'FIRST':'

我需要对具有许多不同迭代的pandas系列应用带条件的文本替换。实现这一目标的最佳方式是什么

我的第一个想法是定义一个函数,在函数中迭代,然后应用它,但是这显然不起作用,因为每行只返回一个值(仅第一次迭代):

我的另一个想法是在apply语句之外定义一个列表,迭代字典键列表,然后使用list元素将函数应用于行,但是,我不确定如何将多参数函数应用于一个系列,以及指定哪个参数是该系列的“row”参数

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

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

您不需要在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)

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

重新导入
def编号更换(x):
匹配项={'FIRST':'1ST',
‘第二’:‘第二’,
‘第三’:‘第三’,
'第四':'第四',
‘第五’:‘第五’,
‘第六’:‘第六’,
‘第七’:‘第七’,
‘EIGTH’:‘8TH’,
‘九’:‘九’,
“第十个”:“第十个”}
对于匹配项中的键。键()
x=re.sub(re.compile(f“\s*{key}”),匹配[key],x)
返回x
数据['STREET REFORMAT']=数据['STREET REFORMAT']。应用(数字替换)

这将用等效的
匹配项替换出现的
,如果未找到匹配项,则返回原始字符串。此解决方案比使用
string.replace()
方法快约2倍,因此对于包含许多行和许多替换字符串的大型数据帧可能有用。

您可以创建两个条件,并使用字典
匹配执行
掩码
,而不是循环:

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
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