对列进行分类会使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周:-/
答案 0 :(得分: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