Python Pandas - 从数据框创建一个用于乘法的数组或矩阵

时间:2018-01-02 00:57:06

标签: python arrays pandas numpy matrix

我发现了这篇帖子,它让我很接近。 how-to-convert-a-pandas-dataframe-subset-of-columns-and-rows-into-a-numpy-array

但是我不是根据第三列中的值创建两列的单个数组(或矩阵),而是需要遍历数据帧并从列'b'到'j创建一个3x3数组(或矩阵) '对于'a'中每个正确匹配的值。

         dft = pd.DataFrame({'a' : ['NW'  ,'NW', 'SL', 'T'], 
'b' : [1,2,3,4], 
'c' : [5,6,7,8], 
'd' : [11,12,13,14], 
'e' : [9,10,11,12], 
'f' : [4,3,2,1], 
'g' : [15,14,13,12], 
'h' : [13,14,15,16], 
'i' : [5,4,3,2], 
'j' : [9,8,7,6]
})

    print(dft)
         a  b   c   d   e   f   g   h   i   j
     0  NW  1   5   11  9   4   15  13  5   9
     1  NW  2   6   12  10  3   14  14  4   8
     2  SL  3   7   13  11  2   13  15  3   7
     3  T   4   8   14  12  1   12  16  2   6

我想要的是2个独立的数组,每个NW

1个
     [[ 1  5 11]
      [ 9  4 15]
      [13  5  9]]

     [[ 2  6 12]
      [10  3 14]
      [14  4  8]]

我尝试了以下内容并收到了一个非常难看的错误。该代码是基于原始帖子的尝试。

    dft.loc[dft['a'] == 'NW',['b', 'c', 'd'], ['e', 'f', 'g'], ['h', 'i', 'j']].values

这是错误 -

  

IndexingError Traceback(最近一次调用   最后)in()   ----> 1 dft.loc [dft ['a'] =='NW',['b','c','d'],['e','f','g'],['h', 'i','j']]。值

     

D:\ Applications \ Anaconda \ lib \ site-packages \ pandas \ core \ indexing.py in    getitem (self,key)1323除外(KeyError,IndexError):1324传递    - > 1325 return self._getitem_tuple(key)1326 else:1327 key = com._apply_if_callable(key,self.obj)

     

D:\ Applications \ Anaconda \ lib \ site-packages \ pandas \ core \ indexing.py in   _getitem_tuple(self,tup)       839       840#没有多索引,因此验证所有索引器    - > 841 self._has_valid_tuple(tup)       842       843#丑陋的hack for GH#836

     

D:\ Applications \ Anaconda \ lib \ site-packages \ pandas \ core \ indexing.py in   _has_valid_tuple(self,key)       186 for i,k in enumerate(key):       187如果我> = self.obj.ndim:    - > 188引发IndexingError('Too many indexers')       189如果不是self._has_valid_type(k,i):       190引发ValueError(“基于位置的索引只能有[%s]”

     

IndexingError:索引器太多

思考?我很亲密,但又很诱人。

  • 我不知道如何格式化错误代码 - 所以有任何帮助来清除它吗?

2 个答案:

答案 0 :(得分:4)

您可以在没有循环的情况下执行此操作

a = df.loc[df['a'] == 'NW', 'b':'j']
n = a.shape[0]
new_a = a.values.reshape(n,3,3)

你得到了

array([[[ 1,  5, 11],
        [ 9,  4, 15],
        [13,  5,  9]],

       [[ 2,  6, 12],
        [10,  3, 14],
        [14,  4,  8]]])

答案 1 :(得分:0)

我不是100%肯定你在追求什么,但也许这会有所帮助:

new_arrays = []

for index, row in dft.iterrows():
    if row['a'] == 'NW':
        new_arrays.append(row[1:].values.reshape(3, 3))

根据评论中的要求itertuples()

for index, row in enumerate(dft.itertuples(), 1):
    if row[1] == 'NW':
        new_arrays.append(np.array(row[2:]).reshape(3, 3))

现在您拥有new_arrays中的两个数组中的每一个,您可以将它们一起打印或单独访问:

new_arrays[0]

array([[1, 5, 11],
       [9, 4, 15],
       [13, 5, 9]], dtype=object)

new_arrays[1]

array([[2, 6, 12],
       [10, 3, 14],
       [14, 4, 8]], dtype=object)