我正在尝试从以下词典中提取名称:
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'
答案 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']]