我想为每个客户制作一张桌子,上面列出所有可用的产品。但是,如果购买的话,我只有一张包含产品和客户组合的桌子。我想创建一个新表,其中还包含客户未购买的产品。当前表如下:
我要结束的表是:
有人可以帮我在熊猫中做到这一点吗?
答案 0 :(得分:1)
一种方法是使用pd.MultiIndex
和reindex
:
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的原因。