2015-03-17 3 views
1

У меня есть dataframe, который выглядит следующим образомпанды dataframe рассчитывать уников в отношении к другой колонке

category subcategory contract  week1 week2 week3 
cat1  sub1   11001  20  20  10 
cat1  sub1   11001  0  0  30 
cat1  sub2   11002  10  20  0 
cat1  sub2   11003  10  20  0 
cat2  sub3   11004  10  0  50 
cat2  sub3   11005  10  20  0 

Я хотел бы рассчитывать на каждую неделю количество уникальных контрактов, которые отличны от нуля в неделю по категории и подкатегории.

category | subcategory | week1 | week2 | week3 | 
----------------------------------------------- 
cat1  | sub1  | 1  | 1  | 1 | 
cat1  | sub2  | 2  | 2  | 0 | 
cat2  | sub3  | 2  | 1  | 1 | 

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

ответ

3

Во-первых, группа по 'category', 'subcategory', 'contract', взять сумму и испытание, если сумма больше нуля:

In [179]: result = df.groupby(['category', 'subcategory', 'contract']).sum() > 0 

In [180]: result 
Out[180]: 
           week1 week2 week3 
category subcategory contract      
cat1  sub1  11001  True True True 
     sub2  11002  True True False 
        11003  True True False 
cat2  sub3  11004  True False True 
        11005  True True False 

Теперь группа этот результат по 'category' и 'subcategory', и суммируют эти группы чтобы подсчитать количество элементов в каждой группе, которые являются истинными:

In [181]: result.groupby(level=['category','subcategory']).sum().dropna(axis=0) 
Out[181]: 
         week1 week2 week3 
category subcategory      
cat1  sub1    1  1  1 
     sub2    2  2  0 
cat2  sub3    2  1  1 

import io 
import pandas as pd 

df = '''\ 
category | subcategory | contract | week1 | week2 | week3 
cat1  | sub1   | 11001 |  20 | 20 | 10 
cat1  | sub1   | 11001 |  0 | 0 | 30 
cat1  | sub2   | 11002 |  10 | 20 | 0  
cat1  | sub2   | 11003 |  10 | 20 | 0  
cat2  | sub3   | 11004 |  10 | 0 | 50 
cat2  | sub3   | 11005 |  10 | 20 | 0 ''' 

df = pd.read_table(io.BytesIO(df), sep=r'\s*[|]\s*') 
result = df.groupby(['category', 'subcategory', 'contract']).sum() > 0 
result = result.groupby(level=['category','subcategory']).sum().dropna(axis=0) 
print(result) 

выходы

     week1 week2 week3 
category subcategory      
cat1  sub1    1  1  1 
     sub2    2  2  0 
cat2  sub3    2  1  1 
Смежные вопросы