我一直在试图操纵一只熊猫DataFrame。希望有人可以帮助我!
我拥有一个如下所示的DataFrame:
Index Product ID Category Sale Amount
----- ------- -- -------- ---- ------
200 Prod1 01 Online Yes 100
201 Prod1 01 Offline Yes 150
202 Prod1 01 Online No 123
203 Prod1 01 Offline No 123
204 Prod1 02 Online Yes 198
205 Prod1 02 Offline Yes 175
206 Prod1 02 Online No 148
207 Prod1 03 Online No 193
208 Prod1 03 Offline No 134
我想要创建的,是一个如下所示的DataFrame:
Index Product ID Category Sale Amount Online-Sale Online-NoSale Offline-Sale Offline-NoSale
----- ------- -- -------- ---- ------ ----------- ------------- ------------ --------------
200 Prod1 01 Online Yes 100 100 0 0 0
201 Prod1 01 Offline Yes 150 0 0 150 0
202 Prod1 01 Online No 123 0 123 0 0
203 Prod1 01 Offline No 123 0 0 0 123
204 Prod1 02 Online Yes 198 198 0 0 0
205 Prod1 02 Offline Yes 175 0 0 175 0
206 Prod1 02 Online No 148 0 148 0 0
207 Prod1 03 Online No 193 0 193 0 0
208 Prod1 03 Offline No 134 0 0 0 134
DataFrame中有4个额外列,每个列对应一个(Category,Sale)组合。
我最终会将此DataFrame进一步分割为:
Index Product ID Online-Sale Online-NoSale Offline-Sale Offline-NoSale
----- ------- -- ----------- ------------- ------------ --------------
200 Prod1 01 100 0 0 0
201 Prod1 01 0 0 150 0
202 Prod1 01 0 123 0 0
203 Prod1 01 0 0 0 123
204 Prod1 02 198 0 0 0
205 Prod1 02 0 0 175 0
206 Prod1 02 0 148 0 0
207 Prod1 03 0 193 0 0
208 Prod1 03 0 0 0 134
由于Sale和Category列是多余的,我可以摆脱它们。
我一直在为今天的大部分时间进行黑客攻击而且我没有运气。我怀疑自己被不同的选择/切片方法的浅层和深层复制搞砸了。
谢谢!
答案 0 :(得分:0)
我觉得你误解了菲利普。这看起来像是一个中间步骤,您不想计算离线/在线销售总量,或类似的东西。如果是这种情况,您应该使用groupby。如果没有,这就是你不能用它完成它的事情:
online = df['Category'] == 'Online'
sale = df['Sale'] == 'Yes'
df['Online-Sale'] = df['Amount'][online & sale]
df['Online-NoSale'] = df['Amount'][online & (~sale)]
df['Offline-Sale'] = df['Amount'][(~online) & sale]
df['Offline-NoSale'] = df['Amount'][(~online) & (~sale)]
df.fillna(0, inplace=True)
df[['Index', 'Product', 'ID',
'Online-Sale', 'Online-NoSale', 'Offline-Sale', 'Offline-NoSale']]
Index Product ID Online-Sale Online-NoSale Offline-Sale Offline-NoSale
0 200 Prod1 1 100 0 0 0
1 201 Prod1 1 0 0 150 0
2 202 Prod1 1 0 123 0 0
3 203 Prod1 1 0 0 0 123
4 204 Prod1 2 198 0 0 0
5 205 Prod1 2 0 0 175 0
6 206 Prod1 2 0 148 0 0
7 207 Prod1 3 0 193 0 0
8 208 Prod1 3 0 0 0 134
但这非常多余,而且,正如@Phillip所提到的,如果你想要聚合值,你应该使用groupby。
答案 1 :(得分:0)
创建一个新键,它是您想要旋转的字段的组合。
df['key'] = df.Category +'-' + df.Sale
df2 = df.set_index(['Index', 'Product', 'ID', 'Category', 'Sale', 'key'])
df3 = df2.unstack().fillna(0).reset_index()
df3.columns = ['Index', 'Product', 'ID', 'Category', 'Sale', 'Offline-No', 'Offline-Yes', 'Online-No', 'Online-Yes']
重置列是删除复合索引名称
产生以下结果:(如果需要,删除额外的列)
Index Product ID Category Sale Offline-No Offline-Yes Online-No Online-Yes
----- ------- -- -------- ---- ---------- ----------- --------- ----------
200 Prod1 1 Online Yes 0 0 0 100
201 Prod1 1 Offline Yes 0 150 0 0
202 Prod1 1 Online No 0 0 123 0
203 Prod1 1 Offline No 123 0 0 0
204 Prod1 2 Online Yes 0 0 0 198
205 Prod1 2 Offline Yes 0 175 0 0
206 Prod1 2 Online No 0 0 148 0
207 Prod1 3 Online No 0 0 193 0
208 Prod1 3 Offline No 134 0 0 0