使用匹配组作为函数中的参数

时间:2019-10-05 17:52:26

标签: python regex pandas dataframe

我有一个数据框,其中我们使用的是美国人的大小,我想用正则表达式(或其他...)替换这些以厘米为单位的值

#approximation
def conversion(one, two):
    print(one)
    return (int(one)*30 + float(int(two)*2.5))

df_test = df_dummies
df_test['Height'] = df_test['Height'].replace({r'(\w+)\+(\w+)' : conversion( r'\1' , r'\2' )}, regex=True).astype(float)

我已经尝试过了,但是匹配的组不起作用

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-189-d4278403d30f> in <module>
      5 
      6 df_test = df_dummies
----> 7 df_test['Height'] = df_test['Height'].replace({r'(\w+)\+(\w+)' : conversion( r'\1' , r'\2' )}, regex=True).astype(float)
      8 df_test.head().transpose()

<ipython-input-189-d4278403d30f> in conversion(one, two)
      2 def conversion(one, two):
      3     print(one)
----> 4     return (int(one)*30 + float(int(two)*2.5))
      5 
      6 df_test = df_dummies

ValueError: invalid literal for int() with base 10: '\\1'

但如果我这样做:

#approximation
def conversion(one, two):
    print(one)
    return (int(one)*30 + float(int(two)*2.5))

df_test = df_dummies
df_test['Height'] = df_test['Height'].replace({r'(\w+)\+(\w+)' : r'\1' +r'\2' }, regex=True).astype(float)

工作正常,我得到了两个匹配组的串联

是否存在一种解决方案,可将结果转换为数据帧中的转换(一次,两次)?

1 个答案:

答案 0 :(得分:0)

使用支持回调的Series.str.replace()作为替代。

def conversion(m): 
    return str(int(m.group(1))*30 + float(int(m.group(2))*2.5))

df_test['Height'] = df_test['Height'].str.replace(r'(\d+)\+(\d+)', conversion).astype(float)

回调函数采用一个参数,即正则表达式匹配对象。您将需要返回字符串作为替换。