我发现了这篇帖子,它让我很接近。 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 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:索引器太多
思考?我很亲密,但又很诱人。
答案 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)