Я пытался воспроизвести вашу проблему следующим образом:
sample = {
'timestampMs': '1540084102574',
'latitudeE7': 327160442,
'longitudeE7': -1171687098,
'accuracy': 17,
'altitude': -13,
'verticalAccuracy': 3,
'activity': [{
'timestampMs': '1540083982124',
'activity': [{
'type': 'STILL',
'confidence': 100
}]
}]
}
# Creating an empty `DataFrame` of length one
df = pd.DataFrame([None],columns=['locations'])
# Passing your sample dictionary as its only value
df['locations'][0] = sample
Теперь и altitute
, и verticalAccuracy
отлично работают для меня, так как они оба keys
во внешнем словаре.
df['altitude'] = df['locations'].map(lambda x: x['altitude'])
df['verticalAccuracy'] = df['locations'].map(lambda x: x['verticalAccuracy'])
Для вложенных элементов обратите внимание, что activity
- это list
длины один.
type(sample.get('activity')) # returns `list`
len(sample.get('activity')) # returns 1
Таким образом, вам нужно проиндексировать первый (в данном случае индексный номер ноль) элемент списка. Этот элемент, в свою очередь, будет представлять собой Python dictionary
, к которому нужно будет обращаться через скобочные обозначения или безопасный .get()
метод.
df['timestampMs'] = df['locations'].map(lambda x: x['activity'][0].get('timestampMs'))
Вы можете применить образец логики к внутреннему activity
словарному ключу, вложенному во внешний.
df['type'] = df['locations'].map(lambda x: x['activity'][0].get('activity')[0].get('type'))
df['confidence'] = df['locations'].map(lambda x: x['activity'][0].get('activity')[0].get('confidence'))