#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