Группировка кадра данных по элементу и счет в Pandas - PullRequest
1 голос
/ 17 апреля 2020

Я начинаю с кадра данных в форме:

scope   provider1    provider2   provider3
------------------------------------------
h1       A             AA          AAA
c12      B             AA          BBB
hn3      A             BB          AAA
hs34     C             CC          BBB
623x     B             DD          CCC
m23      A             AA          BBB

, где A, AA и AAA - это три совершенно разные метки.

Я хочу сосчитать количество раз, когда каждая метка появляется и получает фрейм данных:

label    provider   value_count
-------------------------------
A        provider1    3
B        provider1    2
C        provider1    1
AA       provider2    3
BB       provider2    1
CC       provider2    1
DD       provider2    1
AAA      provider3    2
BBB      provider3    3
CCC      provider3    1

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Использование DataFrame.melt с заполнителем GroupBy.size:

df = (df.melt('scope', value_name='label', var_name='provider')
        .groupby(['provider','label'])
        .size()
        .reset_index(name='value_count')
        )
print (df)
    provider label  value_count
0  provider1     A            3
1  provider1     B            2
2  provider1     C            1
3  provider2    AA            3
4  provider2    BB            1
5  provider2    CC            1
6  provider2    DD            1
7  provider3   AAA            2
8  provider3   BBB            3
9  provider3   CCC            1

Альтернатива с DataFrame.set_index и DataFrame.stack:

df = (df.set_index('scope')
        .stack()
        .rename_axis(['scope','provider'])
        .reset_index(name='label')
        .groupby(['provider','label'])
        .size()
        .reset_index(name='value_count')
)
print (df)
    provider label  value_count
0  provider1     A            3
1  provider1     B            2
2  provider1     C            1
3  provider2    AA            3
4  provider2    BB            1
5  provider2    CC            1
6  provider2    DD            1
7  provider3   AAA            2
8  provider3   BBB            3
9  provider3   CCC            1
1 голос
/ 17 апреля 2020

Вы можете melt и groupby:

(df.melt(id_vars='scope', value_name='label', var_name='provider')
   .groupby(['variable', 'value']).size().reset_index())

     label provider 0
0  provider1     A  3
1  provider1     B  2
2  provider1     C  1
3  provider2    AA  3
4  provider2    BB  1
5  provider2    CC  1
6  provider2    DD  1
7  provider3   AAA  2
8  provider3   BBB  3
9  provider3   CCC  1
...