【问题标题】:Use matching groups as arguments in function在函数中使用匹配组作为参数
【发布时间】:2019-10-05 17:52:26
【问题描述】:

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

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

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

有没有一种解决方案可以将结果转换(一,二)作为数据框中的替换?

【问题讨论】:

  • 您能否提供一些示例数据和预期输出?
  • 您的字符串可能包含导致转换错误的'" 字符。

标签: python regex pandas dataframe


【解决方案1】:

使用支持回调的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)

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

【讨论】:

  • 哇!绝对精彩,感谢您的帮助,因为您猜我是 python 的初学者,我不太了解回调机制...谢谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多