Python 从字符串中提取定量信息

Python 从字符串中提取定量信息,python,regex,pandas,feature-extraction,text-extraction,Python,Regex,Pandas,Feature Extraction,Text Extraction,我正在分析开放式食品事实数据集。 数据集非常混乱,有一个名为“quantity”的列,其中包含如下条目: ‘100克’, “5盎司(142克)”, ‘12盎司’, '200克', “12盎司(340克)”, “10盎司(296毫升)”, ‘750毫升’, “1 l”, “250毫升”, ‘8盎司’, “10.5盎司(750克)”, “1加仑(3.78升)”, ‘27盎司(1磅11盎司)765g’, “75 cl” 正如你所看到的,测量值和单位到处都是!有时,数量是以两种不同的测量方式给出的。。。

我正在分析开放式食品事实数据集。 数据集非常混乱,有一个名为“quantity”的列,其中包含如下条目:

‘100克’,
“5盎司(142克)”,
‘12盎司’,
'200克',
“12盎司(340克)”,
“10盎司(296毫升)”,
‘750毫升’,
“1 l”,
“250毫升”, ‘8盎司’,
“10.5盎司(750克)”,
“1加仑(3.78升)”,
‘27盎司(1磅11盎司)765g’,
“75 cl”

正如你所看到的,测量值和单位到处都是!有时,数量是以两种不同的测量方式给出的。。。 我的目标是在pandas数据框中创建一个新的列“quantity\u in_g”,从字符串中提取信息,并根据“quantity”列中的克数创建一个整数值。 因此,如果数量列有'200g',我想要整数200,如果它说'1kg',我想要整数1000。我还想把其他度量单位转换成克。对于“2盎司”,我想要整数56,对于1升,我想要1000。
有人能帮我转换一下这个专栏吗? 我会非常感激的
提前感谢

原始数据=['100克'、'5盎司(142克)'、'12盎司'、'200克'、'12盎司(340克)'、'10 f盎司(296ml)'、'750毫升'、'1升'、'250毫升'、'8盎司',]
raw_data_lst = ['100 g ','5 oz (142 g)','12 oz','200 g ','12 oz (340 g)','10 f oz (296ml)','750 ml','1 l','250 ml', '8 OZ',] 
# 10 f oz (296ml)  don't know what f is
# if more there is more data like this then gram_conv_dict.keys() loop over this instead of directly ... doing what i have done below

in_grams_colm = []
gram_conv_dict ={
    'g':1,
    'oz': 28.3495,
    'kg':1000,
    'l': 1000 # assuming 1 litre of water --> grams
    }
# ml --> g is tricky as density varies

def convert2num(string_num):
    try:
        return int(string_num)
    except ValueError:
        return float(string_num)

def get_in_grams(unit):
    try:
        return gram_conv_dict[unit.lower()]
    except:
        print('don\'t know how much grams is present in 1',unit+'.')

    return 1


for data in raw_data_lst:
    i = 0
    quantity_str =''
    quantity_num = 0
    while i < len(data):
        if  47 < ord(data[i]) < 58 or data[i] == '.':
            quantity_str+= data[i]
        else:
            # data[i] = '' most abbrv has at most length = 2 therefore data[i+1:i+3] or u can just send the whole data[i+1:]
            # gram_conv_dict[data[i+1:i+3].strip()] directly check if key exist
            break

        i+=1

    quantity_num = convert2num(quantity_str)*get_in_grams(data[i+1:i+3].strip()) # assuming each data has this format numberspace-- len 2 abbrv
    in_grams_colm.append(quantity_num) # if u want only integer int(quantity_num)

#print(in_grams_colm)

def nice_print():
    for _ in in_grams_colm:
        print('{:.2f}'.format(_))

nice_print()
'''
output

don't know how much grams is present in 1 f.
don't know how much grams is present in 1 ml.
don't know how much grams is present in 1 ml.
100.00
141.75
340.19
200.00
340.19
10.00
750.00
1000.00
250.00
226.80'''
#10盎司(296毫升)不知道f是什么 #如果有更多像这样的数据,那么gram_conv_dict.keys()将在此循环,而不是直接。。。做我下面所做的 单位:克 革兰氏对照={ “g”:1, “盎司”:28.3495, “千克”:1000, “l”:1000#假设1升水-->克 } #ml-->g随着密度的变化而变化 def convert2num(字符串数量): 尝试: return int(string_num) 除值错误外: 返回浮点(字符串数量) def获取单位:克(单位): 尝试: 返回gram_conv_dict[unit.lower()] 除: 打印('不知道1'中有多少克,单位为+'。) 返回1 对于原始数据中的数据: i=0 数量_str='' 数量=0 而i
您还没有问过这个问题吗?没有,我的最后一个问题是如何从字符串中提取第一个整数。您能否提供所需的输出?您可以使用
re
(regex)模块提取每行中的零件。我不熟悉正则表达式,但我认为它可能类似于
r.*(\d{0,4}g)。*”
。有人可以修改这个吗?你可以在循环中使用
enumerate
:对于I,枚举中的数据(原始数据列表):@mooglinux是的,谢谢:)@mooglinux,但我使用I从数据而不是原始数据列表中获取索引I处的字符串(字符)。