TypeError:不可用类型:使用pandas Multi Index时的'dict'

时间:2017-03-27 08:42:57

标签: python pandas dataframe

我试图在另一个数据帧的顶部添加一个有2行和大约200列的数据帧,但我得到了TypeError:unhashable类型:'dict'。 这是我正在使用的代码: df是第一个包含2行和大约200列的数据帧,我试图将其添加到finaldata数据帧。

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

当我检查带有type()的数据帧类型时,我得到了pandas.core.frame.DataFrame

1 个答案:

答案 0 :(得分:2)

对于df的第一和第二行的位置选择,您似乎需要iloc

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