我从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”
在活动中也有一个嵌套结构。我该如何将它们映射到数据框?
答案 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
现在,altitute
和verticalAccuracy
都对我来说很好用,因为它们在外部词典中都是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'))