在dataframe python中,对循环中的每个迭代使用不同的正则表达式

在dataframe python中,对循环中的每个迭代使用不同的正则表达式,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个要在pandas数据框中搜索的单位列表,然后将这些单位转换为正确命名的单位,并将它们的值与下面列表中的常数因子相乘。下面是示例数据帧 >> df product info product___A 3.5 m mini-jack product___B 3.5 kg mini-jack product___C 3.5mm mini-jack product___D 3.5 millimeter mini-j

我有一个要在pandas数据框中搜索的单位列表,然后将这些单位转换为正确命名的单位,并将它们的值与下面列表中的常数因子相乘。下面是示例数据帧

>> df
product                     info
product___A     3.5 m mini-jack
product___B     3.5 kg mini-jack
product___C     3.5mm mini-jack
product___D     3.5 millimeter mini-jack
product___E     43 centimeter mini-jack
下面是我的代码实现

import re
import pandas as pd
units_origianal = ['Kilogram', 'millimeter', 'pounds', 'ounce', 'centimeter', 'kilometers']
units = ['kg', 'mm', 'lbs' 'oz', 'cm', 'm']
factor = [0.543, 654.53, 53.64,0.744, 43.8, 98.123]
def norm_units(x):
    for i in range(len(units)):
        if ('\d+\s'+units_origianal[i] in x or re.search('\d+'+units_origianal[i],str(x))):
            quantity = re.findall("\d+\.\d+", str(x))[0]
            resulting_quantity = float(quantity) * factor[i]
                return x.replace(quantity, resulting_quantity).replace(units_origianal[i], units[i])

df = df.apply(norm_units)


>> df
    # Expected resulting Dataframe
product                     info
product___A      344.05 m mini-jack
product___B      1.9005 kg mini-jack
product___C      2290.155 mm mini-jack
product___D      2290.155 mm mini-jack
product___E      1883.4 cm mini-jack
运行代码后得到的结果数据帧

  product info
0  None  None
1  None  None
2  None  None
3  None  None
4  None  None

感谢您的帮助。

您可能需要使用
str。用正则表达式组替换

>> factors = {'Kilogram': 0.543, 'kg': 0.543, 
              'millimeter': 654.54, 'mm': 654.54,
              'pounds': 53.64, 'lbs': 53.64,
              'ounce': 0.744, 'oz': 0.744,
              'centimeter': 43.8, 'cm': 43.8, 
              'kilometers': 98.123, 'm': 98.123}
>> pat = "(?P<val>\d+\.?\d?)\s*(?P<unit>(%s))" % '|'.join(factors)
>> def repl(p):
>>     val, unit = float(p.group('val')), p.group('unit')
>>     return str(factors[unit] * val) + ' ' + unit
>> df['info'] = df['info'].str.replace(pat, repl)
>> df

    product      info
0   product___A  343.4305 m mini-jack
1   product___B  1.9005 kg mini-jack
2   product___C  2290.89 mm mini-jack
3   product___D  2290.89 millimeter mini-jack
4   product___E  1883.3999999999999 centimeter mini-jack
>系数={'kg':0.543,'kg':0.543,
“毫米”:654.54,“毫米”:654.54,
“磅”:53.64,“磅”:53.64,
“盎司”:0.744,“盎司”:0.744,
“厘米”:43.8,“厘米”:43.8,
“公里”:98.123,“米”:98.123}
>>pat=“(?P\d+\.?\d?)\s*(?P(%s))”%'|'。连接(因子)
>>def repl(p):
>>val,单位=浮动(p.group('val')),p.group('unit'))
>>返回str(系数[单位]*val)+''+单位
>>df['info']=df['info'].str.replace(pat,repl)
>>df
产品信息
0产品尺寸为343.4305米的小型千斤顶
1件1.9005 kg产品的小型千斤顶
2件产品C 2290.89毫米微型千斤顶
3产品尺寸2290.89毫米迷你插孔
4产品规格1883.3999999999厘米迷你插孔

您可能需要使用
str.replace
正则表达式组

>> factors = {'Kilogram': 0.543, 'kg': 0.543, 
              'millimeter': 654.54, 'mm': 654.54,
              'pounds': 53.64, 'lbs': 53.64,
              'ounce': 0.744, 'oz': 0.744,
              'centimeter': 43.8, 'cm': 43.8, 
              'kilometers': 98.123, 'm': 98.123}
>> pat = "(?P<val>\d+\.?\d?)\s*(?P<unit>(%s))" % '|'.join(factors)
>> def repl(p):
>>     val, unit = float(p.group('val')), p.group('unit')
>>     return str(factors[unit] * val) + ' ' + unit
>> df['info'] = df['info'].str.replace(pat, repl)
>> df

    product      info
0   product___A  343.4305 m mini-jack
1   product___B  1.9005 kg mini-jack
2   product___C  2290.89 mm mini-jack
3   product___D  2290.89 millimeter mini-jack
4   product___E  1883.3999999999999 centimeter mini-jack
>系数={'kg':0.543,'kg':0.543,
“毫米”:654.54,“毫米”:654.54,
“磅”:53.64,“磅”:53.64,
“盎司”:0.744,“盎司”:0.744,
“厘米”:43.8,“厘米”:43.8,
“公里”:98.123,“米”:98.123}
>>pat=“(?P\d+\.?\d?)\s*(?P(%s))”%'|'。连接(因子)
>>def repl(p):
>>val,单位=浮动(p.group('val')),p.group('unit'))
>>返回str(系数[单位]*val)+''+单位
>>df['info']=df['info'].str.replace(pat,repl)
>>df
产品信息
0产品尺寸为343.4305米的小型千斤顶
1件1.9005 kg产品的小型千斤顶
2件产品C 2290.89毫米微型千斤顶
3产品尺寸2290.89毫米迷你插孔
4产品规格1883.3999999999厘米迷你插孔

我可以将此应用于整个数据帧吗?我想只有一个栏目可以用。实际上,我有一个凌乱的数据集,所以我不知道哪些列可能包含类似info列的结构。我也不知道为什么相同的代码不适用于me@muazfaiz为了帮助您解决这一问题,请在问题中提供一个示例,说明您一直在使用的输入和所需的输出。因为你已经提供的熊猫很好用。你有什么版本的熊猫?版本0.20.0中添加了对
repl
参数的可调用支持。我使用的版本是0.20.1汉克斯。现在可以了。但是,为了将此方法应用于整个数据帧,应该做些什么呢?我可以将此应用于整个数据帧吗?我想只有一个栏目可以用。实际上,我有一个凌乱的数据集,所以我不知道哪些列可能包含类似info列的结构。我也不知道为什么相同的代码不适用于me@muazfaiz为了帮助您解决这一问题,请在问题中提供一个示例,说明您一直在使用的输入和所需的输出。因为你已经提供的熊猫很好用。你有什么版本的熊猫?版本0.20.0中添加了对
repl
参数的可调用支持。我使用的版本是0.20.1汉克斯。现在可以了。但是,为了将这种方法应用于整个数据帧,应该做些什么呢?