Python 在numpy阵列中整合数据
我目前正在处理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]]
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