Skip to main content
 首页 » 编程设计

python之如何分组 ndarray

2025年05月04日9artech

我有 DataFrame(只是一个例子)

D = pd.DataFrame({i: {"name": str(i), 
                      "vector": np.arange(i + i % 4, i + i % 4 + 10), 
                      "sq": i ** 2, 
                      "gp": i % 2} for i in range(10)}).T 
 
  gp name  sq                                    vector 
0  0    0   0            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
1  1    1   1          [2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
2  0    2   4        [4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
3  1    3   9      [6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
4  0    4  16        [4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
5  1    5  25      [6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
6  0    6  36    [8, 9, 10, 11, 12, 13, 14, 15, 16, 17] 
7  1    7  49  [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
8  0    8  64    [8, 9, 10, 11, 12, 13, 14, 15, 16, 17] 
9  1    9  81  [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 

我想按列向量分组,然后按 gp 列分组。我该怎么做?

from dfply import * 
D >>\ 
    groupby(X.vector, X.gp) >>\ 
    summarize(b=X.sq.sum()) 

结果

TypeError: unhashable type: 'numpy.ndarray'

请您参考如下方法:

我认为您需要先在 pandas 中将列 vector 转换为元组:

print(D['sq'].groupby([D['vector'].apply(tuple), D['gp']]).sum().reset_index()) 
                                     vector  gp   sq 
0            (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)   0    0 
1          (2, 3, 4, 5, 6, 7, 8, 9, 10, 11)   1    1 
2        (4, 5, 6, 7, 8, 9, 10, 11, 12, 13)   0   20 
3      (6, 7, 8, 9, 10, 11, 12, 13, 14, 15)   1   34 
4    (8, 9, 10, 11, 12, 13, 14, 15, 16, 17)   0  100 
5  (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)   1  130 

另一种解决方案是先转换列:

D['vector'] = D['vector'].apply(tuple) 
print(D.groupby(['vector','gp'])['sq'].sum().reset_index()) 
                                     vector  gp   sq 
0            (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)   0    0 
1          (2, 3, 4, 5, 6, 7, 8, 9, 10, 11)   1    1 
2        (4, 5, 6, 7, 8, 9, 10, 11, 12, 13)   0   20 
3      (6, 7, 8, 9, 10, 11, 12, 13, 14, 15)   1   34 
4    (8, 9, 10, 11, 12, 13, 14, 15, 16, 17)   0  100 
5  (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)   1  130 

Anf 如果需要,最后转换为 array 返回:

D['vector'] = D['vector'].apply(tuple) 
df = D.groupby(['vector','gp'])['sq'].sum().reset_index() 
df['vector'] = df['vector'].apply(np.array) 
print (df) 
                                     vector  gp   sq 
0            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]   0    0 
1          [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]   1    1 
2        [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]   0   20 
3      [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]   1   34 
4    [8, 9, 10, 11, 12, 13, 14, 15, 16, 17]   0  100 
5  [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]   1  130 
 
print (type(df['vector'].iat[0])) 
<class 'numpy.ndarray'> 

我尝试使用您的代码并且对我有用:

from dfply import * 
 
D['vector'] = D['vector'].apply(tuple) 
a = D >> groupby(X.vector, X.gp) >> summarize(b=X.sq.sum()) 
a['vector'] = a['vector'].apply(np.array) 
print (a) 
   gp                                    vector    b 
0   0            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]    0 
1   1          [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]    1 
2   0        [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]   20 
3   1      [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]   34 
4   0    [8, 9, 10, 11, 12, 13, 14, 15, 16, 17]  100 
5   1  [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]  130