合并numpy数组中的数据

时间:2015-04-20 20:04:58

标签: 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]]
      ]
    ],
    [
      [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,但我对使用它们并不是很熟悉,所以经过一段时间的努力,我想我会来这里。非常感谢任何帮助。

2 个答案:

答案 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数组。您的输出数组不是其中之一,而是锯齿状数组。