Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:在数据帧上使用itertuples()时,要解压缩的值太多_Python_Json_Pandas_Nested - Fatal编程技术网

Python ValueError:在数据帧上使用itertuples()时,要解压缩的值太多

Python ValueError:在数据帧上使用itertuples()时,要解压缩的值太多,python,json,pandas,nested,Python,Json,Pandas,Nested,我正试图根据我在这里找到的答案,将一个简单的pandas数据帧转换为一个嵌套的JSON文件: 我的分组数据框如下所示: firstname lastname orgname phone mobile email teamname members 1 0 John D

我正试图根据我在这里找到的答案,将一个简单的pandas数据帧转换为一个嵌套的JSON文件:

我的分组数据框如下所示:

                  firstname lastname  orgname         phone        mobile  email
teamname members                                                           
1        0            John      Doe     Anon  916-555-1234          none   john.doe@wildlife.net 
         1            Jane      Doe     Anon  916-555-4321  916-555-7890   jane.doe@wildlife.net
2        0          Mickey    Moose  Moosers  916-555-0000  916-555-1111   mickey.moose@wildlife.net
         1           Minny    Moose  Moosers  916-555-2222          none   minny.moose@wildlife.net  
我的代码是:

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

据我所知,它将返回一个元组,第一个值是索引,其余值是所有列。您只有for
index,group.itertuples()中的值,这意味着它试图将所有列解压到一个变量中,这是行不通的。
groupby
可能也会起作用,但它仍然应该包含结果中的所有值,这意味着您仍然有太多的列被解包。

使用时,索引作为元组的一部分,因此
对于index,value in group.itertuples():
实际上没有意义。实际上,
itertuples()
使用with
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:][/code>:

for t in grouped.itertuples():
    for i, key in enumerate(t.Index):
        ...

如果要访问
namedtuple
的组件,可以按位置或按名称访问。因此,对于数据帧,
t[1]
t.firstname
应该是等效的。请记住,
t[0]
是索引,因此您的第一列从
1

开始,如果我运行这两行,我得到:对于I,输入enumerate(t.index):TypeError:“内置函数”或“方法”对象不是iterableIndex应该大写:
enumerate(t.index)
。这给了我一个不同的错误:对于I,输入enumerate(t.Index):AttributeError:“tuple”对象没有属性“Index”您使用的是哪个版本的
pandas
(请参见
pd.\uuuuuuuuu version\uuuuuu
)?如果是较旧版本,
itertuples
可能尚未实现为
namedtuple
,因此尝试按名称访问它可能不起作用。尝试按位置调用它:
enumerate(t[0])
。如果这不起作用,请尝试查看由
itertuples
生成的一些元组,看看它实际为您生成了什么,并相应地调整您的代码。这是我的最终代码
data=pandas.read_excel(inputExcel,sheetname='SCAT Teams',encoding='utf8')grouped=data.groupby(['teamname','members')).first()打印分组结果=defaultdict(lambda:defaultdict(dict))用于分组中的t.itertuples():对于i,输入枚举(t.Index):如果i==0:nested=results[key]elif i==len(t.Index)-1:nested[key]=t else:nested=nested[key]jsonOutput=json.dumps(结果,缩进=4)