Python, панды — Почему расхождения в итоговых значениях уникальных элементов сводной таблицы по сравнению с groupby

#pandas #pandas-groupby #pivot-table #unique #counting

#панды #панды-групповые #сводный стол #уникальный #подсчет

Вопрос:

У меня есть набор данных, в котором несколько раз участвовали люди. Я хотел бы подсчитать уникальное количество людей по полу. Я сделал это с помощью метода сводной таблицы и groupby и получил различные значения. Я не могу понять, почему. Можете ли вы сказать мне очевидный элемент, который я упустил из виду?

Решение для сводной таблицы: введите описание изображения здесь

Групповое решение: введите описание изображения здесь

Как вы можете видеть, оба дают правильные значения для конкретного «пола». Скорее, это разные итоговые показатели. Groupby, по-видимому, предоставляет правильные итоговые значения, в то время как итоговые значения сводной таблицы кажутся отключенными. Почему?

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

1. Примечание: в наборе данных нет NAN.

Ответ №1:

Это может быть вашей проблемой. Если есть имена, которые являются общими для разных полов, то pivot_table дубликаты не учитываются. groupby подсчитывает дубликаты, как показано в этом небольшом примере, где имя » A «является как «M», так и » F » полами

 import pandas as pd import sidetable   df = pd.DataFrame({  'Gender':['M','F','M','M','F','T','F','F'],  'Name': ['A','A','C','D','E','F','G','H'], })  piv_df = df.pivot_table(index='Gender',values='Name',aggfunc=pd.Series.nunique,margins=True) gb_df = df.groupby('Gender').agg({'Name':'nunique'}).stb.subtotal()  print(piv_df) print(gb_df)  

Выход

 Name Gender  F 4 M 3 T 1 All 7  Name Gender  F 4 M 3 T 1 grand_total 8  

Вы можете проверить это, df = df.drop_duplicates('Name') прежде чем piv и гб, и подсчеты должны совпадать, если это единственная причина различий

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

1. Спасибо! Вот и все. Здорово знать, что сводная таблица работает таким образом (на самом деле, как бы этого хотелось). Конечно, мои проблемы только усложнились, когда около 3000 человек сообщили об этом в одну сторону, а теперь в другую. C’est la vie.