Как извлекать данные из словарей, содержащихся в столбце фрейма данных pandas, из каждой строки

#python #json #pandas #dataframe

#python #json #pandas #фрейм данных

Вопрос:

У меня есть некоторые данные в следующем формате (заголовки: ‘ID’, который является целым числом, и ‘feature’, который находится в макете словаря, но я думаю, что это тип объекта в соответствии с функцией type ()):

 ID      feature
862     [{'id': 931, 'name': 'blue'}, {'id': 4290, 'name': 'black'}
8844    [{'id': 10090, 'name': 'red'}, {'id': 10941, 'name': 'yellow'}
...     ...
  
 print(pd.concat([df['ID'], pd.json_normalize(df['keywords'])],axis=1))
  

Я получаю следующую ошибку:

 AttributeError: 'str' object has no attribute 'values'
  

Я также попробовал следующее:

 df = pd.DataFrame([[y['name'] for y in x] for x in df['keywords']], index=df.index)
  

но я получаю следующую ошибку:

 TypeError: string indices must be integers
  

Конечный результат, который я ищу, это:

 ID      feature
862     blue, black
8844    red, yellow
  

Любой намек?

Ответ №1:

если ваши данные представлены в строковом формате, вы можете попробовать регулярное выражение

 import re
import pandas as pd
def func(string):
    return re.findall("'name': '(w )'", string)

columns = ['ID','feature']
data = [['862',"{'id': 931, 'name': 'blue'}, {'id': 4290, 'name': 'black'}"],
['8844',"{'id': 10090, 'name': 'red'}, {'id': 10941, 'name': 'yellow'}"]]

df = pd.DataFrame(data, columns=columns)
df["feature_colors"] = df["feature"].apply(func)
print(df[["ID", "feature_colors"]])
  

выводит:

      ID feature_colors
0   862  [blue, black]
1  8844  [red, yellow]
  

или используйте json

 import json
def func2(string):
    json_lst = json.loads(string)
    lst = []
    for el in json_lst:
        lst.append(el["name"])
    return lst