如何计算numpy数组中两列的频率?

时间:2018-04-04 06:47:09

标签: python arrays pandas numpy

In [56]: df
Out[56]:
array([[3, 133, nan, ..., 202, 109, 1427],
       [3, 133, nan, ..., 183, 120, 1448],
       [3, 133, nan, ..., 205, 22, 417],
       ...,
       [8, 43, nan, ..., 88, 11, 11],
       [64, 173, nan, ..., 2774, 2029, 1210],
       [12, 85, nan, ..., 19, 10, 25]], dtype=object)
collections.Counter(df[:,[0,1]])

df是numpy数组,我想得到第一列和第二列的计数,就像count(*) from df group by col-0, col-1一样 但是返回错误TypeError: unhashable type: 'numpy.ndarray' 我怎么能意识到它?

熊猫非常慢,我不倾向于使用它。

3 个答案:

答案 0 :(得分:0)

collection.Counter用于计算可清洗对象,&numpy.ndarray'是不可用的,所以我们需要将其转换为可清除对象。例如,

>>> a = np.array([  [1, 2, 3],
        [1, 4, 5],
        [5, 6, 7],
        [8, 9, 10]])
>>> b = np.hsplit(a,3)[0]
>>> b
array([[1],
   [1],
   [5],
   [8]])
>>> c = b.flatten().tolist()
>>> c
[1, 1, 5, 8]
>>> collections.Counter(c)
>>> c
Counter({1: 2, 8: 1, 5: 1})

希望这有帮助。

答案 1 :(得分:0)

a = np.array([[4, 3, 2],
              [1, 0, 3],
              [1, 2, 3],
              [0, 1, 4],
              [0, 3, 3],
              [0, 2, 0],
              [1, 4, 3],
              [4, 1, 2],
              [0, 1, 3],
              [2, 1, 0]])

纯粹 numpy 方式:

In [8]: np.apply_along_axis(np.bincount, 0, a)
Out[8]: 
array([[4, 1, 2],
       [3, 4, 0],
       [1, 2, 2],
       [0, 2, 5],
       [2, 1, 1]])

使用 Pandas

df = pd.DataFrame(a)

In [10]: df[0].value_counts()
Out[10]: 
0    4
1    3
4    2
2    1

如果您想同时使用多个列:

In [11]: df.apply(pd.Series.value_counts, axis=0)
Out[11]: 
     0  1    2
0  4.0  1  2.0
1  3.0  4  NaN
2  1.0  2  2.0
3  NaN  2  5.0
4  2.0  1  1.0

你也可以摆脱NaN s

In [12]: df.apply(pd.Series.value_counts, axis=0).fillna(0)
Out[12]: 
     0  1    2
0  4.0  1  2.0
1  3.0  4  0.0
2  1.0  2  2.0
3  0.0  2  5.0
4  2.0  1  1.0

答案 2 :(得分:0)

由于您使用的是numpy,因此您可以使用numpy.unique

a = np.array([  [1, 2, 3],
                [1, 4, 5],
                [5, 6, 7],
                [8, 9, 10]])

res = np.unique(a[:, :3], return_counts=True)
# (array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10]), array([2, 1, 1, 1, 2, 1, 1, 1, 1, 1], dtype=int64))

res_dict = dict(zip(*res))
# {1: 2, 2: 1, 3: 1, 4: 1, 5: 2, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1}