Python熊猫-从数据帧创建用于乘法的数组或矩阵
我找到了这篇先前的帖子,它让我很接近。 但是,我不需要根据第三列中的值生成由两列组成的单个数组(或矩阵),而是需要遍历数据帧,为“a”中每个正确匹配的值从“b”列到“j”列创建一个3x3数组(或矩阵)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' : [
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]”
索引错误:索引器太多
思想?我如此接近,却又如此遥远
- 我不知道如何设置错误代码的格式,所以有什么帮助来清除它吗
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,我想这会很难;)多亏了这个板!