Количество столбцов по конкретным значениям - PullRequest
2 голосов
/ 03 июня 2019
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 ]

3 голосов
/ 03 июня 2019

Может использовать 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 голосов
/ 03 июня 2019

Вы можете использовать np.bincount с apply_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)
3 голосов
/ 03 июня 2019

Давайте попробуем:

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]])
2 голосов
/ 03 июня 2019

Моя попытка с get_dummies и sum:

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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...