Pandas:分类列bugs pivot_选项卡

2024-09-28 22:05:32 发布

您现在位置:Python中文网/ 问答频道 /正文

将列设为category会使pivot\u表不稳定。 这里有一个例子:

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

给出:

^{pr2}$

我们有正确的groupby:

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周:-/


Tags: testnanpdpivotvaluesclosingweekmai
1条回答
网友
1楼 · 发布于 2024-09-28 22:05:32

在Pandas 0.19.2/python3.6.0上测试

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

另外,信任Pandas字符串映射是一个很好的实践,可以使用aggfunc='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')

结果

在Pandas中实现分类时,您将找到未使用类别和已使用类别的行:

^{pr2}$

相关问题 更多 >