#python
#python
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
user_id event_desc
100013 {'firebase_screen': '/product-popup', 'banner_id': '9260'}
100022 {'firebase_screen': '/product-popup', 'banner_id': '9152'}
100076 {'firebase_screen_id': '-1531185473150377061'}
100076 {'banner_id': '8567', 'firebase_screen': '/product-popup'}
Я пытаюсь получить значения ключевого идентификатора banner_id.
Итак, вывод выглядит следующим образом:
user_id event_desc banner_id
100013 {'firebase_screen': '/product-popup', 'banner_id': '9260'} 9260
100022 {'firebase_screen': '/product-popup', 'banner_id': '9152'} 9151
100076 {'firebase_screen_id': '-1531185473150377061'} Nan
100076 {'banner_id': '8567', 'firebase_screen': '/product-popup'} 8567
Я использую приведенный ниже код.
df['banner_id'] = df['event_desc'].apply(lambda x: x.get('banner_id'))
Это выдает ошибку:
объект ‘str’ не имеет атрибута ‘get’
Ответ №1:
Пока они не хранятся в виде строк, это работает:
import pandas as pd
df = pd.DataFrame([
[100013, {'firebase_screen': '/product-popup', 'banner_id': '9260'}],
[100022, {'firebase_screen': '/product-popup', 'banner_id': '9152'}],
[100076 , {'firebase_screen_id': '-1531185473150377061'}],
[100076 , {'banner_id': '8567', 'firebase_screen': '/product-popup'}]], columns =['user_id', 'event_desc'])
df['banner_id'] = df['event_desc'].apply(lambda x: x.get('banner_id'))
Я предполагаю, основываясь на вашей ошибке, что столбец — это не столбец словарей, а скорее столбец строк:
import pandas as pd
df = pd.DataFrame([
[100013, "{'firebase_screen': '/product-popup', 'banner_id': '9260'}"],
[100022, "{'firebase_screen': '/product-popup', 'banner_id': '9152'}"],
[100076 , "{'firebase_screen_id': '-1531185473150377061'}"],
[100076 , "{'banner_id': '8567', 'firebase_screen': '/product-popup'}"]], columns =['user_id', 'event_desc'])
df['banner_id'] = df['event_desc'].apply(lambda x: x.get('banner_id'))
AttributeError: 'str' object has no attribute 'get'
Итак, если это так, вы захотите использовать:
import pandas as pd
import ast
df = pd.DataFrame([
[100013, "{'firebase_screen': '/product-popup', 'banner_id': '9260'}"],
[100022, "{'firebase_screen': '/product-popup', 'banner_id': '9152'}"],
[100076 , "{'firebase_screen_id': '-1531185473150377061'}"],
[100076 , "{'banner_id': '8567', 'firebase_screen': '/product-popup'}"]], columns =['user_id', 'event_desc'])
df['banner_id'] = df['event_desc'].apply(lambda x: ast.literal_eval(x).get('banner_id'))
ДОПОЛНИТЕЛЬНЫЕ:
import pandas as pd
import ast
def eval_code(code):
parsed = ast.parse(code, mode='eval')
fixed = ast.fix_missing_locations(parsed)
compiled = compile(fixed, '<string>', 'eval')
return eval(compiled)
df = pd.DataFrame([
[100013, "{'firebase_screen': '/product-popup', 'banner_id': '9260'}"],
[100022, "{'firebase_screen': '/product-popup', 'banner_id': '9152'}"],
[100076 , "{'firebase_screen_id': '-1531185473150377061'}"],
[100076 , "{'banner_id': '8567', 'firebase_screen': '/product-popup'}"]], columns =['user_id', 'event_desc'])
df['banner_id'] = df['event_desc'].apply(lambda x: eval_code(x).get('banner_id'))
Комментарии:
1. использование приведенного выше дает мне ошибку «Ошибка значения: неверно сформированный узел или строка».
2. есть ли способ поделиться вашим точным фреймом данных? может быть, только первые 5-10 строк?
3. я могу отправить u..id пожалуйста?
4. df[‘banner_id’] = df[‘event_desc’].apply(лямбда x: ast.literal_eval(str(x)).get(‘banner_id’)) .. это сработало … спасибо
Ответ №2:
df['banner_id'] = df['event_desc'].apply(lambda x: ast.literal_eval(str(x)).get('banner_id'))
Комментарии:
1. Пожалуйста, объясните, почему это решение проблемы OP. Ответы только на код не приветствуются, поскольку они не помогают OP или будущим посетителям сайта.