如何使用pandas列

时间:2017-12-15 04:12:47

标签: python pandas

我所拥有的是四列矩阵。我想保留前两列并将最后两列转换为一种出现矩阵(但具有相应的值)。我试图通过[' shop_id',' item_id',' date']进行分组,但不知道如何为那些空白日期填写0。有人有想法吗?非常感谢

given:
shop_id item_id date sales
0       19      0    1
0       19      2    13
0       19      3    11
1       19      1    3

result:
shop_id item_id date_0 date_1 date_2 date_3 
0       19      1      0      13     11
1       19      0      3      0      0

3 个答案:

答案 0 :(得分:2)

让我们使用set_indexunstackfillna

df.set_index(['shop_id','item_id','date'])['sales'].unstack()\
  .add_prefix('date_').reset_index().fillna(0).astype(int)

输出:

date  shop_id  item_id  date_0  date_1  date_2  date_3
0           0       19       1       0      13      11
1           1       19       0       3       0       0

答案 1 :(得分:2)

使用defaultdict

import pandas as pd
from collections import defaultdict

d = defaultdict(dict)
for (shop, item, date, sales) in df.values.tolist():
    d[date][(shop, item)] = sales

pd.DataFrame(d).fillna(0, downcast='infer') \
  .add_prefix('date_').rename_axis(['shop_id', 'item_id']).reset_index()

   shop_id  item_id  date_0  date_1  date_2  date_3
0        0       19       1       0      13      11
1        1       19       0       3       0       0

答案 2 :(得分:1)

这是一个pivot_table解决方案,应该非常快 -

df = df.pivot_table(
            index=['shop_id', 'item_id'], 
            columns=['date'],  
            values=['sales'], 
            fill_value=0)\
       .add_prefix('date_').reset_index()

df

     shop_id item_id date_sales                     
date                     date_0 date_1 date_2 date_3
0          0      19          1      0     13     11
1          1      19          0      3      0      0

在决定使用哪种解决方案之前,请确保在数据上测试两种解决方案!