Python ValueError:在数据帧上使用itertuples()时,要解压缩的值太多
我正试图根据我在这里找到的答案,将一个简单的pandas数据帧转换为一个嵌套的JSON文件: 我的分组数据框如下所示: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
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()
使用withIndex
作为名称之一
请考虑以下设置:
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)