我正试图将一个简单的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()使用namedtupleIndex是其中一个名称。
考虑以下设置:

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开始。

09-18 17:58