Как сделать простую частотную таблицу в Pandas - PullRequest
2 голосов
/ 12 октября 2019

Мне нужно посчитать целые числа от 1 до 5 по строкам в кадре данных Pandas. Например, для

import pandas as pd

df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
2   2   3  NaN   3    

будет создано следующее:

   n1  n2  n3  n4  n5
0   1   1   2   0   0
1   1   1   1   0   1
2   0   1   2   0   0

Я встречал .value_counts и crosstab, но я просто не смогнастроить либо получить то, что мне нужно. Любая помощь будет высоко ценится.

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 12 октября 2019

Что вы можете сделать, это использовать функцию .apply для фрейма данных следующим образом:

>>> df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})
>>> df
   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
2   2   3  NaN   3
>>> df.apply(pd.Series.value_counts, axis=1)
   1.0  2.0  3.0  5.0
0  1.0  1.0  2.0  NaN
1  1.0  1.0  1.0  1.0
2  NaN  1.0  2.0  NaN

Наслаждайтесь (: и для справки - Подсчитайте вхождения элементов в Серии в каждой строкеDataFrame

ps - очевидно, что если число не существует, оно не создаст таблицу с большим количеством чисел, которых не существует, чтобы заполнить таблицу до последнего существующего числа, таблицыбудет просто содержать числа, которые как минимум имеют 1 вид.

4 голосов
/ 12 октября 2019

stack + get_dummies

df1 = pd.get_dummies(df.stack().astype(int)).sum(level=0)

# Cleans up names, types, missing
idx = range(1, 6)
df1 = df1.reindex(idx, axis=1).add_prefix('n').fillna(0, downcast='infer')

   n1  n2  n3  n4  n5
0   1   1   2   0   0
1   1   1   1   0   1
2   0   1   2   0   0
3 голосов
/ 12 октября 2019

Вам нужно Series.value_counts + reindex:

new_df=( df.apply(lambda x: x.value_counts(),axis=1)
        .reindex(columns=np.arange(1,6).astype(int))
        .fillna(0).add_prefix('n') )
print(new_df)

    n1   n2   n3   n4   n5
0  1.0  1.0  2.0  0.0  0.0
1  1.0  1.0  1.0  0.0  1.0
2  0.0  1.0  2.0  0.0  0.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...