首页 > 解决方案 > 仅从带有附加文本 ml,kg,l 的文本中提取数字

问题描述

我只想从我的 DataFrame 列中提取具有 kg、ml、l 或 kg 的数字。我需要创建一个新列并从每一行中仅提取具有 ml、l、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+)')

但我想在一个新列中输出只有公斤、毫升或升(公斤、毫升、升)的数字。像这样的东西:

5kg

10 ml

0.5 l

2 kilograms

标签: python-3.xdataframedata-science

解决方案


快到了,试试:

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]

推荐阅读