矢量化groupby熊猫

时间:2018-05-02 14:29:05

标签: python-3.x pandas dataframe

我有一个这样的数据框:

day    time    category   count    

 1      1         a         13
 1      2         a         47
 1      3         a         1
 1      5         a         2
 1      6         a         4
 2      7         a         14
 2      2         a         10
 2      1         a         9
 2      4         a         2
 2      6         a         1

我希望按天分组,并按类别获取每次计数的向量。时间可以在1到10之间。我在两个变量中定义的最大和最小时间称为max和min。

这就是我希望结果数据框看起来的样子:

day     category   count    

 1          a      [13,47,1,0,2,4,0,0,0,0]
 2          a      [9,10,0,2,0,1,14,0,0,0]

有谁知道如何将这种聚合变成一个vaector?

1 个答案:

答案 0 :(得分:1)

使用reindexMultiIndex.from_product添加缺失的类别,然后groupby添加list

df = df.set_index(['day','time', 'category'])

a = df.index.levels[0]
b = range(1,11)
c = df.index.levels[2]

df = df.reindex(pd.MultiIndex.from_product([a,b,c], names=df.index.names), fill_value=0)
df = df.groupby(['day','category'])['count'].apply(list).reset_index()
print (df)
   day category                             count
0    1        a  [13, 47, 1, 0, 2, 4, 0, 0, 0, 0]
1    2        a  [9, 10, 0, 2, 0, 1, 14, 0, 0, 0]

编辑:

df = (df.set_index(['day','time', 'category'])['count']
       .unstack(1, fill_value=0)
       .reindex(columns=range(1,11), fill_value=0))
print (df)
time          1   2   3   4   5   6   7   8   9   10
day category                                        
1   a         13  47   1   0   2   4   0   0   0   0
2   a          9  10   0   2   0   1  14   0   0   0

df = df.apply(list, 1).reset_index(name='count')
print (df)

   day                ...                                            count
0    1                ...                 [13, 47, 1, 0, 2, 4, 0, 0, 0, 0]
1    2                ...                 [9, 10, 0, 2, 0, 1, 14, 0, 0, 0]

[2 rows x 3 columns]