当使用 pandas 的多重索引时,出现 TypeError: unhashable type: 'dict' 错误。

3

我尝试将一个有2行和大约200列的dataframe添加到另一个dataframe的顶部,但是出现了TypeError: unhashable type: 'dict'。 这是我使用的代码: df是第一个dataframe,有2行和大约200列,我正在尝试将其添加到finaldata dataframe中。

finaldata.columns = pd.MultiIndex.from_arrays([df.values[0], finaldata.columns]) 

当我使用type()检查数据框的类型时,我得到了。
1个回答

2

看起来你需要使用iloc来选择df的第一行和第二行:

finaldata.columns = pd.MultiIndex.from_arrays([df.iloc[0], df.iloc[1], finaldata.columns]) 

示例:

df = pd.DataFrame({'a':[2,3],
                   'b':[5,6],
                   'c':[1,5],
                   'd':[4,5],
                   'e':[1,5],
                   'f':[8,9]})

print (df)
   a  b  c  d  e  f
0  2  5  1  4  1  8
1  3  6  5  5  5  9

finaldata = pd.DataFrame({'A':[1,2,3],
                         'B':[4,5,6],
                         'C':[7,8,9],
                         'D':[1,3,5],
                         'E':[5,3,6],
                         'F':[7,4,3]})

print (finaldata)
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

names = ['first','second','third']
finaldata.columns = pd.MultiIndex.from_arrays([df.iloc[0], 
                                               df.iloc[1], 
                                               finaldata.columns], names=names)
print (finaldata)
first   2  5  1  4  1  8
second  3  6  5  5  5  9
third   A  B  C  D  E  F
0       1  4  7  1  5  7
1       2  5  8  3  3  4
2       3  6  9  5  6  3

使用numpy.concatenate的另一种解决方案:

a = np.concatenate([df.values, np.array(finaldata.columns).reshape(-1,df.shape[1])]).tolist()
print (a)
[[2, 5, 1, 4, 1, 8], [3, 6, 5, 5, 5, 9], ['A', 'B', 'C', 'D', 'E', 'F']]

names = ['first','second','third']
finaldata.columns = pd.MultiIndex.from_arrays(a, names=names)
print (finaldata)
first   2  5  1  4  1  8
second  3  6  5  5  5  9
third   A  B  C  D  E  F
0       1  4  7  1  5  7
1       2  5  8  3  3  4
2       3  6  9  5  6  3

编辑:

解决方案非常类似,只需要使用 reindex 函数重新索引列即可:

df = pd.DataFrame({'A':[2,3],
                   'B':[5,6],
                   'C':[1,5],
                   'D':[4,5],
                   'E':[1,5],
                   'F':[8,9]})

print (df)
   A  B  C  D  E  F
0  2  5  1  4  1  8
1  3  6  5  5  5  9

finaldata = pd.DataFrame({'A':[1,2,3],
                          'B':[4,5,6],
                          'E':[7,8,9],
                          'F':[1,3,5]})

print (finaldata)
   A  B  E  F
0  1  4  7  1
1  2  5  8  3
2  3  6  9  5

df1 = df.reindex(columns=finaldata.columns)
print (df1)
   A  B  E  F
0  2  5  1  8
1  3  6  5  9

names = ['first','second','third']
finaldata.columns = pd.MultiIndex.from_arrays([df1.iloc[0], 
                                               df1.iloc[1], 
                                               finaldata.columns], names=names)
print (finaldata)
first   2  5  1  8
second  3  6  5  9
third   A  B  E  F
0       1  4  7  1
1       2  5  8  3
2       3  6  9  5

我认为问题在于列数不同,df数据框具有更多的列,因为它是由引用对象创建的数据框。那么,我该如何仅添加出现在finaldata中的df列呢?抱歉我第一次没有表达清楚。@jezrael - jovicbg
你能否使用我的示例数据框,进行更改并创建所需输出的示例?因为我似乎不理解问题出在哪里。 - jezrael
我已将XML文件解析为字典,然后创建了数据框,但是我引用了一个对象(其他所有对象都与该对象进行比较),该对象未包含在数据框中。现在我需要将该对象的值放在数据框的顶部。 我尝试从仅包含该引用对象的字典中创建新的数据框,然后将其添加到其他字典中。虽然有些复杂,但我会想办法的。 :) - jovicbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接