按列的特定值计数

时间:2019-06-03 13:27:07

标签: python-3.x pandas matrix arraylist

aMat=df1000.iloc[:,1:].values
print(aMat)

通过使用上面的代码,我从数据集中获得了以下提到的数据矩阵:

[[1 2 5 2 4]
 [1 2 1 2 2]
 [1 2 4 2 4]
 [1 5 1 1 4]
 [1 4 4 2 5]]

数据集只能保存1,2,3,4和5值。所以我想计算第一列中存在1的数量,第一列中存在2的数量,第一列中存在3的数量,第一列中存在4的数量,第一列中存在5的数量,第一列中存在的数量1第二列,.............等等。最终,列表将如下所示:

[[5,0,0,0,0],[0,3,0,1,1],[2,0,0,2,5],[1,4,0,0,0],[0,1,0,3,1]]

请帮助

4 个答案:

答案 0 :(得分:3)

让我们尝试一下:

df = pd.DataFrame([[1, 2, 5, 2, 4],
 [1, 2, 1, 2, 2],
 [1, 2, 4, 2, 4],
 [1, 5, 1, 1, 4],
 [1, 4, 4, 2, 5]])

df.apply(pd.Series.value_counts).reindex([1,2,3,4,5]).fillna(0).to_numpy('int')

输出:

array([[5, 0, 2, 1, 0],
       [0, 3, 0, 4, 1],
       [0, 0, 0, 0, 0],
       [0, 1, 2, 0, 3],
       [0, 1, 1, 0, 1]])

或者,转置:

df.apply(pd.Series.value_counts).reindex([1,2,3,4,5]).fillna(0).T.to_numpy('int')

输出:

array([[5, 0, 0, 0, 0],
       [0, 3, 0, 1, 1],
       [2, 0, 0, 2, 1],
       [1, 4, 0, 0, 0],
       [0, 1, 0, 3, 1]])

答案 1 :(得分:3)

您可以将np.bincountapply_along_axis一起使用。

a = df.to_numpy()
np.apply_along_axis(np.bincount, 0, a, minlength=a.max()+1).T[:, 1:]

array([[5, 0, 0, 0, 0],
       [0, 3, 0, 1, 1],
       [2, 0, 0, 2, 1],
       [1, 4, 0, 0, 0],
       [0, 1, 0, 3, 1]], dtype=int64)

答案 2 :(得分:3)

可以使用stack

df.stack().groupby(level=1).value_counts().unstack(fill_value=0).reindex(columns=[1,2,3,4,5],fill_value=0)
Out[495]: 
   1  2  3  4  5
0  5  0  0  0  0
1  0  3  0  1  1
2  2  0  0  2  1
3  1  4  0  0  0
4  0  1  0  3  1

collections中的方法

pd.DataFrame(list(map(collections.Counter,a.T))).fillna(0)#.values
Out[527]: 
     1    2    4    5
0  5.0  0.0  0.0  0.0
1  0.0  3.0  1.0  1.0
2  2.0  0.0  2.0  1.0
3  1.0  4.0  0.0  0.0
4  0.0  1.0  3.0  1.0

答案 3 :(得分:2)

我尝试使用get_dummiessum

pd.get_dummies(df.stack()).sum(level=1)

   1  2  4  5
0  5  0  0  0
1  0  3  1  1
2  2  0  2  1
3  1  4  0  0
4  0  1  3  1

如果需要第3列全为零,请使用reindex

pd.get_dummies(df.stack()).sum(level=1).reindex(columns=range(1, 6), fill_value=0)

   1  2  3  4  5
0  5  0  0  0  0
1  0  3  0  1  1
2  2  0  0  2  1
3  1  4  0  0  0
4  0  1  0  3  1

或者,如果您喜欢麻木主菜和广播的配菜:

# edit courtesy @user3483203
np.equal.outer(df.values, np.arange(1, 6)).sum(0)

array([[5, 0, 0, 0, 0],
       [0, 3, 0, 1, 1],
       [2, 0, 0, 2, 1],
       [1, 4, 0, 0, 0],
       [0, 1, 0, 3, 1]])