熊猫:分类列错误pivot_table

时间:2018-07-16 12:38:39

标签: python pandas pivot-table

对列进行分类会使pivot_table变得不稳定。 这里是一个示例:

test = pd.DataFrame({'closing_mois': {6483: 'juillet',
  19771: 'avril',
  19105: 'avril',
  8025: 'novembre',
  22642: 'mai',
  1216: 'juillet',
  21634: 'décembre',
  19230: 'décembre',
  11429: 'décembre',
  24755: 'juin'},
 'closing_week': {6483: 28,
  19771: 16,
  19105: 16,
  8025: 48,
  22642: 20,
  1216: 31,
  21634: 49,
  19230: 49,
  11429: 52,
  24755: 25},
 'montant': {6483: 15830,
  19771: 13637,
  19105: 28197,
  8025: 42671,
  22642: 41290,
  1216: 575,
  21634: 898,
  19230: 13814,
  11429: 2006,
  24755: 40633}})
test

给予:

    closing_mois    closing_week    montant
1216    juillet 31  575
6483    juillet 28  15830
8025    novembre    48  42671
11429   décembre    52  2006
19105   avril   16  28197
19230   décembre    49  13814
19771   avril   16  13637
21634   décembre    49  898
22642   mai 20  41290
24755   juin    25  40633

我们有正确的分组依据:

test.groupby(["closing_mois", "closing_week"])["montant"].sum()
    closing_mois  closing_week
    avril         16              41834
    décembre      49              14712
                  52               2006
    juillet       28              15830
                  31                575
    juin          25              40633
    mai           20              41290
    novembre      48              42671
    Name: montant, dtype: int64

但是,如果我将月份定为类别:

mois = OrderedDict({1:"janvier", 2:"février", 3:"mars", 4:"avril", 5: "mai", 6:"juin", 7:"juillet", 8:"août", 9:"septembre", 10:"octobre", 11:"novembre", 12:"décembre"})
cat  = pd.Categorical(list(mois.values()), ordered=True)
test.closing_mois = test.closing_mois.astype(cat)

我的数据透视表不正确:月份和值未对齐:

    test.pivot_table(index="closing_mois", columns="closing_week", values="montant", aggfunc=pd.Series.sum)
closing_week    16  20  25  28  31  48  49  52
closing_mois                                
juillet 41834.0 NaN NaN NaN NaN NaN NaN NaN
novembre    NaN NaN NaN NaN NaN NaN 14712.0 2006.0
décembre    NaN NaN NaN 15830.0 575.0   NaN NaN NaN
avril   NaN NaN 40633.0 NaN NaN NaN NaN NaN
mai NaN 41290.0 NaN NaN NaN NaN NaN NaN
juin    NaN NaN NaN NaN NaN 42671.0 NaN NaN

所以在这里,我将52周定为11月而不是12月。

我该怎么办?

编辑

尝试:

mois                  = OrderedDict({1:"janvier", 2:"février", 3:"mars", 4:"avril", 5: "mai", 6:"juin", 7:"juillet", 8:"août", 9:"septembre", 10:"octobre", 11:"novembre", 12:"décembre"})
test['closing_mois']  = pd.Categorical(test['closing_mois'],mois.values(), ordered=True)
res                   = test.pivot_table(index="closing_mois", columns="closing_week",values="montant", aggfunc='sum')
res

仍然给我:

closing_week    16  20  25  28  31  48  49  52
closing_mois                                
juillet 41834.0 NaN NaN NaN NaN NaN NaN NaN
novembre    NaN 41290.0 NaN NaN NaN NaN NaN NaN
décembre    NaN NaN 40633.0 NaN NaN NaN NaN NaN
avril   NaN NaN NaN 15830.0 575.0   NaN NaN NaN
mai NaN NaN NaN NaN NaN 42671.0 NaN NaN
juin    NaN NaN NaN NaN NaN NaN 14712.0 2006.0

6月的第52周:-/

1 个答案:

答案 0 :(得分:0)

在Pandas 0.19.2 / Python 3.6.0上进行了测试

pd.Categorical的第一个参数应该是一系列,而不是详尽的类别列表。

此外,信任熊猫字符串映射是个好习惯,您可以使用aggfunc='sum'代替pd.Series.sum

test['closing_mois']  = pd.Categorical(test['closing_mois'],
                                       mois.values(), ordered=True)

res = test.pivot_table(index="closing_mois", columns="closing_week",
                       values="montant", aggfunc='sum')

结果

它们在熊猫中实现分类的方式,您将找到未使用类别和已使用类别的行:

print(res)

closing_week       16       20       25       28     31       48       49  \
closing_mois                                                                
janvier           NaN      NaN      NaN      NaN    NaN      NaN      NaN   
février           NaN      NaN      NaN      NaN    NaN      NaN      NaN   
mars              NaN      NaN      NaN      NaN    NaN      NaN      NaN   
avril         41834.0      NaN      NaN      NaN    NaN      NaN      NaN   
mai               NaN  41290.0      NaN      NaN    NaN      NaN      NaN   
juin              NaN      NaN  40633.0      NaN    NaN      NaN      NaN   
juillet           NaN      NaN      NaN  15830.0  575.0      NaN      NaN   
août              NaN      NaN      NaN      NaN    NaN      NaN      NaN   
septembre         NaN      NaN      NaN      NaN    NaN      NaN      NaN   
octobre           NaN      NaN      NaN      NaN    NaN      NaN      NaN   
novembre          NaN      NaN      NaN      NaN    NaN  42671.0      NaN   
décembre          NaN      NaN      NaN      NaN    NaN      NaN  14712.0   

closing_week      52  
closing_mois          
janvier          NaN  
février          NaN  
mars             NaN  
avril            NaN  
mai              NaN  
juin             NaN  
juillet          NaN  
août             NaN  
septembre        NaN  
octobre          NaN  
novembre         NaN  
décembre      2006.0