我有一个数据框,其中我们使用的是美国人的大小,我想用正则表达式(或其他...)替换这些以厘米为单位的值
#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)
工作正常,我得到了两个匹配组的串联
是否存在一种解决方案,可将结果转换为数据帧中的转换(一次,两次)?
答案 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)
回调函数采用一个参数,即正则表达式匹配对象。您将需要返回字符串作为替换。