添加不存在的组合

时间:2018-07-24 15:35:00

标签: python pandas

我想为每个客户制作一张桌子,上面列出所有可用的产品。但是,如果购买的话,我只有一张包含产品和客户组合的桌子。我想创建一个新表,其中还包含客户未购买的产品。当前表如下:

initial table

我要结束的表是:

final table

有人可以帮我在熊猫中做到这一点吗?

2 个答案:

答案 0 :(得分:1)

一种方法是使用pd.MultiIndexreindex

df = pd.DataFrame({'Product':list('ABCDEF'),
                   'Customer':[1,1,2,3,3,3],
                   'Amount':[4,5,3,1,1,2]})

indx = pd.MultiIndex.from_product([df['Product'].unique(), 
                                   df['Customer'].unique()], 
                                  names=['Product','Customer'])

df.set_index(['Product','Customer'])\
  .reindex(indx, fill_value=0)\
  .reset_index()\
  .sort_values(['Customer','Product'])

输出:

   Product  Customer  Amount
0        A         1       4
3        B         1       5
6        C         1       0
9        D         1       0
12       E         1       0
15       F         1       0
1        A         2       0
4        B         2       0
7        C         2       3
10       D         2       0
13       E         2       0
16       F         2       0
2        A         3       0
5        B         3       0
8        C         3       0
11       D         3       1
14       E         3       1
17       F         3       2

答案 1 :(得分:0)

您还可以创建一个数据透视表,以单行执行所需的操作。请注意,输出格式是不同的-它是pandas.DataFrame.pivot而不是标准的pandas数据框。但是,如果您对此并不特别担心(取决于您打算使用决赛桌的方式),则以下代码可以完成这项工作。

df = pd.DataFrame({'Product':['A','B','C','D','E','F'],
                   'Customer':[1,1,2,3,3,3],
                   'Amount':[4,5,3,1,1,2]})
pivot_df = df.pivot(index='Product', 
                    columns='Customer',          
                    values='Amount').fillna(0).astype('int')

Output:

Customer  1  2  3
Product          
A         4  0  0
B         5  0  0
C         0  3  0
D         0  0  1
E         0  0  1
F         0  0  2
当原始df中没有相应的条目时,

df.pivot将创建NaN值(例如,它为产品A和客户2创建一个NaN值)。 NaN是浮点值,因此数据透视图中的所有“金额”都隐式转换为浮点。这就是为什么我使用fillna(0)将NaN值转换为0,然后最终将dtype更改回int的原因。