Как сделать сводную таблицу Pandas count со связанными дочерними элементами? - PullRequest
0 голосов
/ 16 апреля 2019

У меня возникла небольшая проблема с питоном данных Python и панд.Я хочу сделать сводную таблицу, которая подсчитывает некоторые связанные элементы.Я получил фрейм данных с этой структурой.

+-----+------------+-----------+-----------+
| ID  | Item_Type  | Basket_ID | OwnerName |
+-----+------------+-----------+-----------+
|   3 | Basket     |           |           |
| 336 | ChickenEgg |         3 | Henk      |
| 841 | SomeEgg    |         3 | Henk      |
| 671 | EasterEgg  |         3 | Piet      |
|   9 | Basket     |           |           |
| 336 | Orange     |         9 | Piet      |
| 841 | Banana     |         9 | Piet      |
| 671 | Strawberry |         9 | Herman    |
| 888 | Apple      |         9 | Herman    |
| 821 | Apricots   |         9 | NaN       |
+-----+------------+-----------+-----------+

Я хочу подсчитать, сколько элементов связано с элементом «Корзина» (родительский) и как часто появляется «OwnerName» с соответствующим элементом «Корзина».

Я хочу свой фрейм данных, как показано ниже.Вы можете увидеть общее количество предметов из Предметов, которые связаны с родительским Item_Type 'Basket', и общее количество, как часто появляется имя.Вы также можете увидеть, сколько «Total_Owners», а также элемент без владельца.

+----+-----------+-------------------+------------+------------+--------------+--------------+------------------+
| ID | Item_Type | Total_Items_Count | Henk_Count | Piet_Count | Herman_Count | Total_Owners | Total_NaN_Values |
+----+-----------+-------------------+------------+------------+--------------+--------------+------------------+
|  3 | Basket    |                 3 |          2 |          1 |            0 |            3 |                  |
|  9 | Basket    |                 5 |          0 |          2 |            2 |            4 |                1 |
+----+-----------+-------------------+------------+------------+--------------+--------------+------------------+

1 Ответ

0 голосов
/ 16 апреля 2019

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

Таблица концептуально является многоуровневым индексом. Идентификатор корзины - это индекс высокого уровня, а «ID» - более детальный индекс уровня. Первое, что вам нужно сделать, это удалить строки, в которых отсутствует basket_id, чтобы обеспечить согласованность гранулярности таблицы.

Допустим, вы назвали свой фрейм данных df.

#  Preparation steps  
df = df[~df["Basket_ID"].isna()]  # Remove the rows that shouldnt be counted.
df.loc[df["OwnerName"].isna(),"OwnerName"] = "unknown"  # set missing to arbitrary value

# Make a pivot table
df = df.pivot_table(index=['Basket_ID'],columns=['OwnerName'],values=['Item_Type'],aggfunc='count').fillna(0)

С этого момента вы сможете рассчитывать оставшиеся столбцы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...