Извлечение нескольких параметров из строки с помощью регулярных выражений или Панд

#python #regex #pandas

Вопрос:

Я работаю со следующим фреймом данных

 0                                                      NaN
1        {u'bphigh': u'120', u'bplow': u'70', u'weight'...
2                                                      NaN
3        {u'bphigh': 120, u'bplow': 60, u'weight': u'10...
4                                                      NaN
                               ...                        
13149                                                  NaN
13150    {u'bphigh': u'110', u'bplow': u'60', u'weight'...
13151    {u'bphigh': u'149', u'bplow': u'90', u'weight'...
13152    {u'bphigh': u'113', u'bplow': u'69', u'weight'...
13153    {u'bphigh': u'115', u'bplow': u'76', u'weight'...
 

Состоящий из параметров ( bphigh bplow weight ) str следующего типа

{u'bphigh': u'120', u'bplow': u'70', u'weight': u'84.8'}

Я хотел бы извлечь эти параметры и соответствующие им значения в столбцы, как показано ниже

     bphigh  bplow   weight
0   11  22  31
1   42  52  61
2   72  82  91
 

Я попытался использовать следующий метод pandas, который на самом деле не был последовательным при извлечении параметров
vitals['vital'].str.extract(r"{u'bphigh':s*(w )")

Существует ли более эффективный обходной путь в панд или регулярных выражениях для решения этой проблемы?

Пожалуйста, Посоветуйте

Комментарии:

1. Попробовать import ast; print (pd.DataFrame(vitals["vital"].fillna("{}").transform(ast.literal_eval).tolist())) ?

2. @HenryYik это приводит к ошибке ValueError: malformed node or string: 0 {}

Ответ №1:

 from ast import literal_eval
 

пробовать:

 df['vital']=df['vital'].astype(str).map(lambda x:literal_eval(x) if x!='nan' else float('NaN'))

#In the above code we are making the string values to actual dictionary via 
#map() method we are iterating the values of 'vital' column and converting the
#string dictionary to actual dictionary via literal_eval() method and anonymous function
#skipping 'nan's' via if/else condition inside map() method
 

Окончательно:

 out=pd.DataFrame(df['vital'].dropna().tolist())[['bphigh','bplow','weight']]

#In the code we are making Dataframe out of the dictionary values in 
#'vital' columns by making list of values of 'vial' column and then we 
#are selecting only these 3 columns ['bphigh','bplow','weight']
 

Теперь, если вы напечатаете out , вы получите желаемый результат

Комментарии:

1. Работает Идеально! Не могли бы вы немного объяснить свой ответ, чтобы я мог его принять?

2. @Люк обновил ответ….. Пожалуйста, взгляните 🙂