我正试图将一个简单的pandas数据帧转换为一个嵌套的JSON文件,基于我在这里找到的答案:pandas groupby to nested json
我的分组数据帧如下所示:
firstname lastname orgname phone mobile email
teamname members
1 0 John Doe Anon 916-555-1234 none [email protected]
1 Jane Doe Anon 916-555-4321 916-555-7890 [email protected]
2 0 Mickey Moose Moosers 916-555-0000 916-555-1111 [email protected]
1 Minny Moose Moosers 916-555-2222 none [email protected]
我的代码是:
data = pandas.read_excel(inputExcel, sheetname = 'Sheet1', encoding = 'utf8')
grouped = data.groupby(['teamname', 'members']).first()
results = defaultdict(lambda: defaultdict(dict))
for index, value in grouped.itertuples():
for i, key in enumerate(index):
if i ==0:
nested = results[key]
elif i == len(index) -1:
nested[key] = value
else:
nested = nested[key]
print json.dumps(results, indent = 4)
第一个“for”循环出现以下错误。在这种情况下,是什么导致了这个错误?要修复它以输出嵌套的json需要什么?
for index, value in grouped.itertuples():
ValueError: too many values to unpack
最佳答案
当使用itertuples()
时,索引作为元组的一部分包含,因此for index, value in grouped.itertuples():
实际上没有意义。实际上,itertuples()
使用namedtuple
而Index
是其中一个名称。
考虑以下设置:
data = {'A': list('aabbc'), 'B': [0, 1, 0, 1, 0], 'C': list('vwxyz'), 'D': range(5,10)}
df = pd.DataFrame(data).set_index(['A', 'B'])
生成以下数据帧:
C D
A B
a 0 v 5
1 w 6
b 0 x 7
1 y 8
c 0 z 9
然后在
df.itertuples()
中打印每个元组会得到:Pandas(Index=('a', 0), C='v', D=5)
Pandas(Index=('a', 1), C='w', D=6)
Pandas(Index=('b', 0), C='x', D=7)
Pandas(Index=('b', 1), C='y', D=8)
Pandas(Index=('c', 0), C='z', D=9)
所以,您可能需要做的是下面的代码,用
value
替换t[1:]
:for t in grouped.itertuples():
for i, key in enumerate(t.Index):
...
如果要访问
namedtuple
的组件,可以按位置或按名称访问。因此,对于数据帧,t[1]
和t.firstname
应该是等价的。请记住t[0]
是索引,所以第一列从1
开始。