我目前正在使用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
,但无法使其工作。我觉得必须有一个更好的方法来做到这一点,而不是遍历每个条目,看看它是否与其他条目匹配,等等。熊猫的groupby
函数很接近,但不能让你保留这个层次结构的能力(如果第2列中有两个b
,则他们的特定z
将不会分配给单个b
)。我也尝试过使用熊猫的DataSet
,但我对使用它们并不是很熟悉,所以经过一段时间的努力,我想我会来这里。非常感谢任何帮助。
答案 0 :(得分:1)
这类问题完全是为什么设计的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
熊猫' groupby函数很接近,但是没有能够保留这种层次结构(如果第2列中有两个b,它们的特定z将不会被分配给单个b)。 / p>
您是否知道可以同时按多个列进行分组by passing a list/tuple of column names to .groupby()
?
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
您可以实现所需的等级'组织使用multilevel indexing:
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
答案 1 :(得分:-1)
Numpy无法做到这一点,因为numpy适用于多维矩形/立方体/ etc数组。您的输出数组不是其中之一,而是锯齿状数组。