Создание кадра данных с использованием панд из загруженных данных истории местоположений? - PullRequest
0 голосов
/ 11 ноября 2018

Я загрузил историю местоположений json из данных карт Google и хотел поместить весь доступный контент в кадр данных pandas.

df['locations'][5] yields the following:

{'timestampMs': '1540084102574',
 'latitudeE7': 327160442,
 'longitudeE7': -1171687098,
 'accuracy': 17,
 'altitude': -13,
 'verticalAccuracy': 3,
 'activity': [{'timestampMs': '1540083982124',
   'activity': [{'type': 'STILL', 'confidence': 100}]}]}

Я могу без проблем отобразить метки времени, широту и долготу, используя:

df['lat'] = df['locations'].map(lambda x: x['latitudeE7'])/10.**7
df['long'] = df['locations'].map(lambda x: x['longitudeE7'])/10.**7 
df['ts_ms'] = df['locations'].map(lambda x: x['timestampMs']).astype(float)/1000

, но не может сделать это для высоты или вертикальной точности, так как возвращает «KeyError»

Также в рамках деятельности есть вложенная структура. Как бы я сопоставить их с фреймом данных?

1 Ответ

0 голосов
/ 12 ноября 2018

Я пытался воспроизвести вашу проблему следующим образом:

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...