0

我一直在试图操纵熊猫数据框。希望有人可以帮助我!

一个看起来像这样的 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 列是多余的,我可以去掉它们。

在今天的大部分时间里,我一直在研究这个问题,但我没有运气。我怀疑我被不同选择/切片方法的浅拷贝和深拷贝搞砸了。

谢谢!

4

2 回答 2

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。

于 2013-09-21T08:43:04.717 回答
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
于 2013-09-21T14:32:23.287 回答