【问题标题】:Extractin only numbers from text with additional text ml,kg,l仅从带有附加文本 ml,kg,l 的文本中提取数字
【发布时间】:2020-02-03 20:04:16
【问题描述】:

我只想从我的 DataFrame 列中提取具有 kg、ml、l 或 kg 的数字。我需要创建一个新列并从每一行中仅提取具有 ml、l、kg 或 kg 的数字。

例子:

data = [[1, 'detergent 5kg , 555667 ch'], [2, '009 ph, cream 10 ml'], [3, 'oliv oil 0.5 l bio, serial number 34455555'], [4, 'dddd 45, 2 kilograms eco corn flour serial number 7788696']] 

df = pd.DataFrame(data, columns = ['id', 'text']) 

我知道我可以用它来提取数字:

df['new_col'] = df.text.str.extract('(\d+)')

但我想在一个新列中输出只有千克、毫升或升(kg、ml、l)的数字。 像这样的:

5kg

10 ml

0.5 l

2 kilograms

【问题讨论】:

    标签: python-3.x dataframe data-science


    【解决方案1】:

    差不多了,试试吧:

    df['new_col'] = df.text.str.extract(r'(\d+[.]{0,1}\d*\s*(kg|ml|l|kilograms))')[0]
    

    输出:

       id  ...      new_col
    0   1  ...          5kg
    1   2  ...        10 ml
    2   3  ...        0.5 l
    3   4  ...  2 kilograms
    

    编辑

    根据后续行动-extract 仅提取第一个匹配项-如果您想要所有匹配项-尝试:

    输入:

    data = [[1, '10mldetergent 5kg , 555667 ch'], [2, '009 ph, cream 10 ml'], [3, 'oliv oil 0.5 l bio, serial number 34455555'], [4, 'dddd 45, 2 kilograms eco corn flour serial number 7788696']] 
    
    df = pd.DataFrame(data, columns = ['id', 'text']) 
    
    df['new_col'] = df.text.str.extractall(r'(\d+[.]{0,1}\d*\s*(kg|ml|l|kilograms))')[0].groupby(level=[0]).agg(list)
    

    输出:

       id  ...        new_col
    0   1  ...    [10ml, 5kg]
    1   2  ...        [10 ml]
    2   3  ...        [0.5 l]
    3   4  ...  [2 kilograms]
    

    【讨论】:

    • 我的一些记录有问题。例如,如果我有 In row Id 1 text: 10mldetergent 5kg , 555667 ch。我的 new_col 中的输出只有 10 毫升,所以没有 5 公斤。另外,如果我要记录单词,例如 10little ...输出将是 10l。我很感兴趣有没有办法解决这个问题?我只需要公斤、毫升、升等数字,所以我的输出中确实需要像 10little 这样的词作为 10l。
    • 我为此添加了解决方案;)
    • 在我的例子中:data = [[1, '10mldetergent 5kg , 555667 ch'], [2, '009 ph, cream 10 ml'], [3, '橄榄油 0.5 l bio,序列号 34455555'], [4, 'dddd 45, 2 公斤生态玉米粉序列号 7788696'],[5, '75756 59498, ufg 8litttu bbb']] df = pd.DataFrame(data, columns = ['id ', 'text']) df 我得到 8l 的单词 8littu 并且 tis 是错误的,因为它不是 l 升。不知道怎么解决?
    • 嗯,这取决于 - 你可以这样做:r'(\d+[.]{0,1}\d*\s*(kg|ml|l|kilograms)([^\w+]|$))' 它将只返回实例,在单元之后你会看到任何字符,除了另一个字母,但它也会消除 8mldetergent,否则它会很难区分 - 无论是一个单位,还是另一个词的开头。
    猜你喜欢
    • 2016-10-27
    • 2017-06-21
    • 2021-12-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2019-03-17
    • 2022-01-18
    • 2018-06-01
    相关资源
    最近更新 更多