результат табличной функции в R с тремя переменными в пандах Python - PullRequest
2 голосов
/ 11 апреля 2019

Допустим, у нас есть этот пример данных.

| mem_id | main_title | sub_title |
-----------------------------------
|   1    |      1     |    1      |
|   10   |      3     |    2      |
|   3    |      3     |    2      |
|   45   |      1     |    2      |
|   162  |      2     |    2      |

... 

1) сводка данных

  • mem_id: уникальный идентификатор 200 человек
  • main_title: 3уникальные метки (1,2,3)
  • sub_title: 6 уникальных меток (1,2,3,4,5,6), и каждый main_title может иметь один из этих субтитров.

возможно повторение, например один mem_id может иметь несколько вариантов (1: основной, 1: суб)

2) вопрос

Я бы хотелсделать результат табличной функции R в Python.

Результат табличной функции R такой.Я могу сделать любую возможную комбинацию из всех main_title и sub_title.Также можно получить счет каждого случая по mem_id.

count.data <- table(data$mem_id, data$main_title, data$sub_title)
count.table <- as.data.frame(count.data)
===============================================
          mem_id   main_title   sub_title value
1            1         1              1     0
2            2         1              1     0
3            3         1              1     0
4            4         1              1     0
5            5         1              1     0
6            6         1              1     0
7            7         1              1     0
.
.
.

Я пытался получить этот результат в Python, и нижеприведенный результат - то, что я получил до сих пор.

cross_table1 = pd.melt(data, id_vars=['main_title ', 'sub_title'], value_vars='mem_id', value_name='mem_id')

==================================================
         main_title sub_title  variable   mem_id
1            1         1         mem_id     10
2            1         1         mem_id     10
3            3         1         mem_id     10
4            4         2         mem_id     10
5            1         4         mem_id     132
6            4         1         mem_id     65
7            4         3         mem_id     88
.
.
.
cross_table2 = cross_table1.pivot_table(index=['main_title ', 'sub_title', 'mem_id'], values='variable', aggfunc='count')

cross_table32.reset_index().sort_values('value')

==============================================
         main_title sub_title  mem_id    value
1            1         1         1         4
2            1         1         2         3
3            3         1         3         1
4            4         2         3         10
5            1         4         3         2
6            1         1         4         5
7            3         2         5         2
.
.
.

Я понимаю, что это показывает только положительный результат столбца value (count of case).

Мне нужно включить все возможные комбинации main_title и sub_title, так как 1 & 1 (main & sub) case должен иметь200 строк с возможным нулевым значением в столбце count.

Было бы очень признательно, если бы я мог получить какую-либо помощь или совет !!Спасибо:)

1 Ответ

0 голосов
/ 11 апреля 2019

В пандах вы можете делать с groupby + reindex

s=df.groupby(df.columns.tolist()).size()
idx=pd.MultiIndex.from_product(list(map(set,df.values.T)))
s=s.reindex(idx,fill_value=0)
s
Out[15]: 
162  1  1    0
        2    0
     2  1    0
        2    1
     3  1    0
        2    0
1    1  1    1
        2    0
     2  1    0
        2    0
     3  1    0
        2    0
10   1  1    0
        2    0
     2  1    0
        2    0
     3  1    0
        2    1
3    1  1    0
        2    0
     2  1    0
        2    0
     3  1    0
        2    1
45   1  1    0
        2    1
     2  1    0
        2    0
     3  1    0
        2    0
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...