Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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熊猫-从数据帧创建用于乘法的数组或矩阵_Python_Arrays_Pandas_Numpy_Matrix - Fatal编程技术网

Python熊猫-从数据帧创建用于乘法的数组或矩阵

Python熊猫-从数据帧创建用于乘法的数组或矩阵,python,arrays,pandas,numpy,matrix,Python,Arrays,Pandas,Numpy,Matrix,我找到了这篇先前的帖子,它让我很接近。 但是,我不需要根据第三列中的值生成由两列组成的单个数组(或矩阵),而是需要遍历数据帧,为“a”中每个正确匹配的值从“b”列到“j”列创建一个3x3数组(或矩阵) 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' : [

我找到了这篇先前的帖子,它让我很接近。

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

         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
我想要的是两个独立的数组,每个
NW

     [[ 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回溯(最近的调用 最后)在() ---->1 dft.loc[dft['a']=='NW',['b','c','d'],['e','f','g'],['h','i','j'].数值

中的D:\Applications\Anaconda\lib\site packages\pandas\core\index.py getitem(self,key)1323,但(keyrerror,indexer)除外:1324通过 ->1325返回self.\u getitem.\u tuple(key)1326其他:1327 key=com.\u如果可调用(key,self.obj),则应用

中的D:\Applications\Anaconda\lib\site packages\pandas\core\index.py _getitem_元组(self,tup) 839 840#没有多索引,因此请验证所有索引器 -->841 self.\u具有有效的\u元组(tup) 842 843#GH的丑陋黑客#836

中的D:\Applications\Anaconda\lib\site packages\pandas\core\index.py _具有有效的\u元组(self,key) 186表示枚举中的i,k(键): 187如果i>=self.obj.ndim: -->188 raise IndexingError('索引器太多') 189如果不是self.\u具有有效的\u类型(k,i): 190 raise VALUERROR(“基于位置的索引只能有[%s]”

索引错误:索引器太多

思想?我如此接近,却又如此遥远

  • 我不知道如何设置错误代码的格式,所以有什么帮助来清除它吗

我不能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))
现在,您在
新建_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)

您可以不使用循环来执行此操作

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]]])

这在我的示例数据中工作得非常好,但在我用真实数据进行测试时,我只是做了
if行['code']=='Network'
它告诉我
code'没有定义
。我缺少什么?其余的数据完全相同,只是原始数据中有更多列。另外,我在Pandas文档中读到
iterrows
不好,使用
itertuples
。我试过了,它说
ValueError:太多的值无法解包(预期为2)
。看起来您的数据帧没有名为
code
的列。是这样吗?至于
itertuples()
,这会让事情变得有点尴尬,但我在答案中添加了解决方案。执行
dft.columns
返回
code\n
。添加了\n,它就起作用了。Gues因为列是文本?
\n
是换行符,您可能需要在
dft.colums
中清除它,以避免fu中出现问题是的。我很高兴它现在可以工作了。我喜欢这个解决方案,但它假设在“a”列中只有两行带有“NW”。您知道有没有一种方法可以在一行中实现这一点,而不必硬编码
reforme()中的第一个值(2)
?@OriolMirosa,你是对的。请看我的解决方案的编辑尼斯!我想你甚至可以删除第二行,让第三行成为
新的a=a.values.restrape(a.shape[0],3,3)
,对吧?@OriolMirosa,是的。我刚刚为Clarity创建了一个变量n,我想这会很难;)多亏了这个板!