根据其他列中的值创建新的DataFrame列?

时间:2013-09-20 21:27:29

标签: python pandas

我一直在试图操纵一只熊猫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列是多余的,我可以摆脱它们。

我一直在为今天的大部分时间进行黑客攻击而且我没有运气。我怀疑自己被不同的选择/切片方法的浅层和深层复制搞砸了。

谢谢!

2 个答案:

答案 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