从下载的位置记录数据中使用大熊猫创建数据框?

时间:2018-11-11 20:27:35

标签: python json pandas maps

我从Google地图数据中下载了位置记录json,并希望将所有可用内容放入熊猫数据框中。

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

我试图按如下方法重现您的问题:

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

现在,altituteverticalAccuracy都对我来说很好用,因为它们在外部词典中都是keys

df['altitude'] = df['locations'].map(lambda x: x['altitude'])
df['verticalAccuracy'] = df['locations'].map(lambda x: x['verticalAccuracy'])

对于嵌套项目,请注意activity是长度为1的list

type(sample.get('activity'))  # returns `list`
len(sample.get('activity'))  # returns 1

因此,您需要索引列表的第一项(在这种情况下,索引号为零)。该项目将依次为Python dictionary,需要通过括号符号或safer .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'))