Python 在numpy阵列中整合数据

Python 在numpy阵列中整合数据,python,arrays,numpy,Python,Arrays,Numpy,我目前正在处理numpy数组中的数据,我想知道是否有办法按某一列对数据进行分组,并将基础数据合并为嵌套在分组项下的单个数组。这听起来可能有点混乱,所以希望这个例子更有意义: Array_1: [[x, y, z, 1], [x, b, z, 2], [a, b, z, 3], [a, c, z, 4]] 我希望结果是这样的: Array_New: [ [x, [ [y], [ [z],[[1],[2]]

我目前正在处理numpy数组中的数据,我想知道是否有办法按某一列对数据进行分组,并将基础数据合并为嵌套在分组项下的单个数组。这听起来可能有点混乱,所以希望这个例子更有意义:

    Array_1: 
    [[x, y, z, 1],
     [x, b, z, 2],
     [a, b, z, 3],
     [a, c, z, 4]]
我希望结果是这样的:

Array_New:
[
  [x,
    [
      [y], [
        [z],[[1],[2]]
      ]
    ],
    [
      [b], [
        [z],[[2],[3]]
      ]
    ]
...]
本质上,我试图得到的层次结构是: -如果第一列匹配,则将其下的所有内容合并到一个值下作为一系列子数组(而不是像我在
append()
中看到的那样的一个条目)。如果第二列也匹配,则将所有内容合并到第二列的一个值下

因此,从我使用
Array_1
的示例中,我们可以得到:
[x]
,然后在
[x]
[y]
[b]
下。在
[y]
下,我会有
[z]
然后在
[z]
[1]
[2]
下。在
[b]
下,我也会有
[z]
,但在
[z]
下,我会有
[2]
[3]


有人知道最好的方法吗?我尝试使用numpy的
vstack
/
hstack
,但无法使其正常工作。我觉得一定有更好的方法来做到这一点,而不是遍历每个条目,看看它是否与其他条目匹配,等等。Pandas的
groupby
函数很接近,但没有给你保留这种层次结构的能力(如果第2列中有两个
b
,则其特定的
z
不会分配给单个
b
)。我也尝试过使用pandas提供的
数据集,但我对使用这些数据集不太熟悉,所以尝试了一段时间后,我想我会来这里。非常感谢您的帮助。

Numpy无法做到这一点,因为Numpy可以处理多维矩形/长方体/etc数组。您的输出数组不是这些数组之一,而是锯齿数组。

这类问题正是pandas设计的目的。它允许您以您可以想象的方式或多或少地对数据进行分组、索引、聚合或过滤

让我们从您的示例阵列开始:

import pandas as pd

a1 = pd.DataFrame({'group':['x', 'x', 'a', 'a'],
                   'product':['y', 'b', 'b', 'c'],
                   'date':['z1', 'z2', 'z3', 'z4'],
                   'performance':range(1, 5)})
print(a1)

#   date group  performance product
# 0   z1     x            1       y
# 1   z2     x            2       b
# 2   z3     a            3       b
# 3   z4     a            4       c
Pandas的groupby功能很接近,但没有赋予您保留此层次结构的能力(如果第2列中有两个b,则其特定的z不会分配给单个b)

您知道可以同时按多个列进行分组吗

您可以通过以下方式实现所需的“分层”组织:


pandas
是一个选项吗?我感觉到了一个问题。你能解释一下为什么要创建这个特殊的结构吗?你实际需要使用
Array\u New
做什么?可能有一种更为简单的方法来实现你的总体目标。我创建这个结构的目的是对不同产品的性能进行分类。我每月有一次这些数字可以追溯到许多年前(1908年),大约有700种。每种产品都属于250组中的1组(因此
[x]
&
[a]
是组,
[y]
[b]
,&
[c]
是产品,
[z]
是日期,数字是性能数字)。由于有数十万行,我试图以允许用户查看性能的方式输出此信息。我的想法是创建一个类似这样的结构,以便用户可以快速调用产品并获得有组织的退货系列。@Brumder22您正在重新创建一个数据库。您应该使用合并/分组在熊猫中的功能或者考虑Python中的SQLite并在表中组织你的数据。谢谢,这很好!起初,熊猫不喜欢我通过了<代码> NDAREX < /代码>,因为我取了你的第一个例子,但是使用了我试图用Duffy数组构建的片段作为组的值。st使用
read_csv
,然后按照您的建议设置索引,现在它可以完全满足我的要求。
for name, group in a1.groupby(('group', 'product')):
    print(name)
    print(group)

# ('a', 'b')
#   date group  performance product
# 2   z3     a            3       b
# ('a', 'c')
#   date group  performance product
# 3   z4     a            4       c
# ('x', 'b')
#   date group  performance product
# 1   z2     x            2       b
# ('x', 'y')
#   date group  performance product
# 0   z1     x            1       y
a1.set_index(['group', 'product'])
print(a1)

#               date  performance
# group product
# x     y         z1            1
#       b         z2            2
# a     b         z3            3
#       c         z4            4