如何制作带有相关子项的熊猫计数数据透视表?

时间:2019-04-16 07:27:06

标签: python pandas numpy dataframe

我在python和pandas数据框方面遇到了一些小问题。 我想制作一个包含一些相关项目的数据透视表。 我有一个具有这种结构的数据框。

+-----+------------+-----------+-----------+
| 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       |
+-----+------------+-----------+-----------+

我想计算与“购物篮”项目(父项)相关的项目有多少,以及“所有者名称”与相关的“购物篮”项目出现的频率。

我希望我的数据框如下所示。 您可以从与父级Item_Type“购物篮”相关的商品中查看商品总数,以及该商品名称出现的频率。 您还可以查看有多少个“总计所有者”,以及没有所有者的项目。

+----+-----------+-------------------+------------+------------+--------------+--------------+------------------+
| 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 :(得分:0)

回答问题需要多个步骤,但核心思想是您应该使用数据透视表。

表在概念上是一个多级索引。购物篮ID是高级索引,“ 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)

从那里开始,您应该能够计算剩余的列