使用pandas从字典列中提取值

时间:2018-12-18 05:15:15

标签: python python-3.x pandas dictionary dataframe

我正在尝试从以下词典中提取名称:

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

以下是我的数据框的外观:

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 :(得分:2)

如果没有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

答案 1 :(得分:1)

使用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())

答案 2 :(得分:0)

尝试以下行:

names = [name.get('Name') for name in df['name']]