У меня есть фрейм данных, который выглядит так:

description     
1906 RES 330 ML
1906 RES 330ML
RES 335 c/6
RES 332 c/12

Я хочу извлечь три последовательные цифры чисел и сохранить его в новом столбце «объем». Мой код такой:

df['volume'] = df['description'].str.extract('([([\d]*[\d]){3,3}?])')

Ожидаемые результаты должны быть такими:

volume
330
330
335
332

Тем не менее, это дает такие результаты:

volume
1906
1906
335
332

Может кто-нибудь помочь мне исправить этот код? Спасибо!!!

1
Elsa Li 28 Авг 2017 в 21:19

3 ответа

Лучший ответ

Может быть, это излишне, но если вы хотите убедиться, что вы не захватываете номера, которые являются частью четырехзначных чисел, вы можете использовать это:

df['volume'] = df.description.str.extract(r'(?<!\d)(\d{3})(?!\d)', expand=False)    
print(df)

       description volume
0  1906 RES 330 ML    330
1   1906 RES 330ML    330
2      RES 335 c/6    335
3     RES 332 c/12    332

Укажите expand=False, чтобы совпадения возвращались только как один pd.Series.


Регулярное выражение:

  • (?<!\d) - указывает, что что-либо перед набором из 3 цифр является чем-то, что не является цифрой
  • (\d{3}) - соответствует 3 цифрам
  • (?!\d) - указывает, что что-либо после набора из 3 цифр является чем-то, что не является цифрой
5
cs95 28 Авг 2017 в 19:11

Регулярное выражение, которое вы ищете \b[\d]{3}\b

Для получения дополнительной информации о \b см.

yugantar 28 Авг 2017 в 20:16

Вам нужно

  • три раза не совпадать с любым количеством цифр, поэтому удалите [\d]*
  • не соответствует 3 цифрам внутри чего-либо, похожего на «слово»,
    особенно не другие цифры, поэтому используйте границу слова \b
  • не разрешать необязательный ?
  • не переусердствовать с набором символов []

Тебе не нужно:

  • использовать две группы захвата ()

Это регулярное выражение найдет ровно три цифры в одиночку:

\b(\d{3})\b
2
Yunnosch 28 Авг 2017 в 18:39