Извлечение значений из столбца словарей с использованием панд - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь извлечь имя из словаря ниже:

df = df[[x.get('Name') for x in df['Contact']]]

Ниже приведен пример того, как выглядит мой Dataframe:

data = [{'emp_id': 101,
  'name': {'Name': 'Kevin',
   'attributes': {'type': 'Contact',
    'url': '/services/data/v38.0/sobjects/Contact/00985300000bt4HEG4'}}},
 {'emp_id': 102,
  'name': {'Name': 'Scott',
   'attributes': {'type': 'Contact',
    'url': '/services/data/v38.0/sobjects/Contact/00985300000yr5UTR9'}}}]

df = pd.DataFrame(data)
df

   emp_id                                               name
0     101  {'Name': 'Kevin', 'attributes': {'type': 'Cont...
1     102  {'Name': 'Scott', 'attributes': {'type': 'Cont...

Я получаю ошибку:

AttributeError: 'NoneType' object has no attribute 'get'

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Попробуйте следующую строку:

names = [name.get('Name') for name in df['name']]
0 голосов
/ 18 декабря 2018

Если нет NaN, используйте json_normalize.

pd.io.json.json_normalize(df.name.tolist())['Name']

0    Kevin
1    Scott
Name: Name, dtype: object

Если есть NaN, вам нужно будет сначала отбросить их.Однако индексы легко сохранить.

df

   emp_id                                               name
0   101.0  {'Name': 'Kevin', 'attributes': {'type': 'Cont...
1   102.0                                                NaN
2   103.0  {'Name': 'Scott', 'attributes': {'type': 'Cont...

idx = df.index[df.name.notna()]
names = pd.io.json.json_normalize(df.name.dropna().tolist())['Name']  
names.index = idx

names

0    Kevin
2    Scott
Name: Name, dtype: object
0 голосов
/ 18 декабря 2018

Используйте apply и используйте tolist, чтобы сделать его списком:

print(df['name'].apply(lambda x: x.get('Name')).tolist())

Вывод:

['Kevin', 'Scott']

Если список не нужен, выберите Series, используйте:

print(df['name'].apply(lambda x: x.get('Name')))

Выход:

0    Kevin
1    Scott
Name: name, dtype: object

Обновление:

print(df['name'].apply(lambda x: x['attributes'].get('Name')).tolist())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...