Подсчитывать уникальные значения внутри групп, а затем сводить два в категории

#python #pandas #dataframe #pandas-groupby

#python #панды #фрейм данных #pandas-groupby

Вопрос:

У меня есть следующий набор данных

 
    Package Document    bool
0   Pkg1    DocumentA   True
1   Pkg1    DocumentA   True
2   Pkg1    DocumentB   True
3   Pkg1    DocumentC   True
4   Pkg2    DocumentA   False
5   Pkg2    DocumentB   True
6   Pkg2    DocumentB   True
7   Pkg2    DocumentC   True
8   Pkg3    DocumentA   False
9   Pkg3    DocumentB   True
10  Pkg3    DocumentD   False
11  Pkg3    DocumentD   True
12  Pkg4    DocumentB   True
13  Pkg4    DocumentC   True
14  Pkg5    DocumentB   False
15  Pkg5    DocumentC   False
  

Мне нужно подсчитать количество пакетов, в которых был идентифицирован документ. а затем подсчитывать их соответствующие значения True False, исходя из условия, что если даже в этой категории пакетов есть одно false, оно будет только False.
такое, что
DocumentA находится в 3 пакетах, из которых он был True один раз и False дважды. Надеюсь, это поможет

 Document Count True False
DocumentA 3 1 2
DocumentB 5 4 1
DocumentC 4 3 1
DocumentD 1 0 1
  

Я смог выполнить подсчет на основе групп, но не смог добраться до этих столбцов True False, используя

 df.groupby("Document")["Package"].nunique()
  

что дает мне

 Document
DocumentA    3
DocumentB    5
DocumentC    4
DocumentD    1
  

Но мне также нужны эти дополнительные столбцы

Ответ №1:

Сначала используйте GroupBy.transform with GroupBy.all , а затем pivot by DataFrame.pivot_table , в последний раз добавьте столбец count by DataFrame.insert :

 print (df.dtypes)
Package     object
Document    object
bool          bool
dtype: object

df["bool"] = df.groupby(["Document",'Package'])["bool"].transform('all')
print (df)
   Package   Document   bool
0     Pkg1  DocumentA   True
1     Pkg1  DocumentA   True
2     Pkg1  DocumentB   True
3     Pkg1  DocumentC   True
4     Pkg2  DocumentA  False
5     Pkg2  DocumentB   True
6     Pkg2  DocumentB   True
7     Pkg2  DocumentC   True
8     Pkg3  DocumentA  False
9     Pkg3  DocumentB   True
10    Pkg3  DocumentD  False
11    Pkg3  DocumentD  False
12    Pkg4  DocumentB   True
13    Pkg4  DocumentC   True
14    Pkg5  DocumentB  False
15    Pkg5  DocumentC  False
  

 df= df.pivot_table(index='Document', 
                   columns='bool', 
                   values='Package', 
                   aggfunc='nunique', 
                   fill_value=0)
df.insert(0, 'count', df.sum(axis=1))
print (df)
bool       count  False  True
Document                     
DocumentA      3      2     1
DocumentB      5      1     4
DocumentC      4      1     3
DocumentD      1      1     0
  

Комментарии:

1. Документ D 1 1 0 не должен давать 2 1 1 результатов. all необходимо применять, когда найдено несколько значений для одного и того же пакета и документа.

2. Это не дает требуемого результата, добавляя один дополнительный столбец, в котором document совпадает, т.Е. для DocumentA и DocumentD @Adirio правильно

3. Преобразование @jezrael превращает каждое значение в df [‘bool’] True, что делает столбец False полностью исчезающим, а столбец True равен столбцу count .

4. @Zaibi — Проблема с образцами данных? Добавлена печать для проверки наличия dtype bool и вывода после transfomr