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'
我怎么能意识到它?
熊猫非常慢,我不倾向于使用它。
答案 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}