如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?
Posted
技术标签:
【中文标题】如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?【英文标题】:How to append from multiple dictionaries in a List to another list with specific parts of the "inner" dictionary? 【发布时间】:2018-08-06 06:41:29 【问题描述】:我有一个列表中的字典:
fit_statstest = ['activities-heart': ['dateTime': '2018-02-01',
'value': 'customHeartRateZones': [],
'heartRateZones': ['caloriesOut': 2119.9464,
'max': 96,
'min': 30,
'minutes': 1232,
'name': 'Out of Range',
'caloriesOut': 770.2719,
'max': 134,
'min': 96,
'minutes': 120,
'name': 'Fat Burn',
'caloriesOut': 0,
'max': 163,
'min': 134,
'minutes': 0,
'name': 'Cardio',
'caloriesOut': 0,
'max': 220,
'min': 163,
'minutes': 0,
'name': 'Peak'],
'restingHeartRate': 64],
'activities-heart-intraday': 'dataset': ['time': '00:00:00', 'value': 57,
'time': '00:00:10', 'value': 56,
'time': '00:00:20', 'value': 59,
'time': '00:00:35', 'value': 59,
'time': '02:54:10', 'value': 85,
'time': '02:54:20', 'value': 71,
'time': '02:54:30', 'value': 66,
...],'datasetInterval': 1,
'datasetType': 'second',
'activities-heart': ['dateTime': '2018-02-02',
'value': 'customHeartRateZones': [],
'heartRateZones': ['caloriesOut': 2200.61802,
'max': 96,
'min': 30,
'minutes': 1273,
'name': 'Out of Range',
'caloriesOut': 891.9588,
'max': 134,
'min': 96,
'minutes': 133,
'name': 'Fat Burn',
'caloriesOut': 35.8266,
'max': 163,
'min': 134,
'minutes': 3,
'name': 'Cardio',
'caloriesOut': 0,
'max': 220,
'min': 163,
'minutes': 0,
'name': 'Peak'],
'restingHeartRate': 67],
'activities-heart-intraday': 'dataset': ['time': '00:00:10', 'value': 80,
'time': '00:00:15', 'value': 79,
'time': '00:00:20', 'value': 74,
'time': '00:00:25', 'value': 72,
'time': '03:04:10', 'value': 61,
'time': '03:04:25', 'value': 61,
'time': '03:04:40', 'value': 61,
...],
'datasetInterval': 1,
'datasetType': 'second']
我正在尝试将 'time': 'hh:mm:ss' 和 'value': Int 附加到 DataFrame。
这就是我为单个字典所做的(就像一个魅力):
time_list = []
val_list = []
for i in fit_statsHR['activities-heart-intraday']['dataset']:
val_list.append(i['value'])
time_list.append(i['time'])
这就是我尝试为多级字典列表做的方式:
time_test = []
val_test = []
for i in fit_statstest:
val_test.append(i['activities-heart-intraday']['dataset']['value'])
time_test.append(i['activities-heart-intraday']['dataset']['time'])
heartdftest = pd.DataFrame('Heart Rate':val_test,'Time':time_test)
我收到此错误:列表索引必须是整数或切片,而不是 str;并且不太确定如何解决这个问题。
我尝试使用 .copy() 方法,但也不满意。
更新: @Phydeaux:为此干杯!我试过这个:
time_test = []
val_test = []
j = np.arange(0,len(fit_statstest))
for i in fit_statstest[j]['activities-heart-intraday']['dataset']:
val_test.append(i['value'])
time_test.append(i['time'])
我现在收到此错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-184-f3e7484e1cfc> in <module>()
3 j = np.arange(0,len(fit_statstest))
4
----> 5 for i in fit_statstest[j]['activities-heart-intraday']['dataset']:
6 val_test.append(i['value'])
7 time_test.append(i['time'])
TypeError: only integer scalar arrays can be converted to a scalar index
只有整数标量数组可以转换为标量索引。不知道我是否走在正确的轨道上!
【问题讨论】:
【参考方案1】:i['activities-heart-intraday']['dataset']
是一个包含多个字典的列表,每个字典都有一个'value'
属性。您正在尝试将此列表视为字典,这就是导致您遇到异常的原因。
您对单个字典的代码有正确的想法。您需要遍历列表并对每个项目执行一些操作。
编辑:你不能直接使用np.arange
来索引这样的列表,正如例外所说。你期望它做什么?
试试这个:
time_test = []
val_test = []
# use descriptive names for your loop indices that give a hint about what they represent
for day in fit_statstest:
for entry in day['activities-heart-intraday']['dataset']:
time_test.append(entry['time'])
val_test.append(entry['value'])
【讨论】:
为此干杯!我试过这个: time_test = [] val_test = [] j = np.arange(0,29) for i in fit_statstest[j]['activities-heart-intraday']['dataset']: val_test.append(i[ 'value']) time_test.append(i['time']) heartdftest = pd.DataFrame('Heart Rate':val_test,'Time':time_test) 我现在得到这个错误:只能转换整数标量数组到一个标量索引。不知道我是否走在正确的轨道上! @Vash 你能把它编辑成问题(格式化)吗?在评论中阅读有点困难。此外,一般来说,如果您包含异常的全文(尤其是出现异常的行)会很有帮助。 抱歉弄得一团糟!我现在已将代码和错误添加到问题中。非常感谢!【参考方案2】:这是通过单个列表理解的一种解决方案:
import pandas as pd
time_values = [(d['time'], d['value']) for day in fit_statstest \
for d in day['activities-heart-intraday']['dataset']]
df = pd.DataFrame(time_values, columns=['time', 'value'])
结果
time value
0 00:00:00 57
1 00:00:10 56
2 00:00:20 59
3 00:00:35 59
4 02:54:10 85
5 02:54:20 71
6 02:54:30 66
7 00:00:10 80
8 00:00:15 79
9 00:00:20 74
10 00:00:25 72
11 03:04:10 61
12 03:04:25 61
13 03:04:40 61
【讨论】:
以上是关于如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?的主要内容,如果未能解决你的问题,请参考以下文章