gpt4 book ai didi

python - pandas 数据透视表 - 导致意外边距的有序类别

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:27 25 4
gpt4 key购买 nike

使用 python 3.7 和 pandas 0.23.4。我正在尝试使用有序的分类数据制作数据透视表。如果我包括边距,小计的顺序似乎不正确。

import pandas as pd
m='male'
f='female'

data = {'num': [0,1,2,3,4,5,6,7,8,9],
'age': [1,2,2,3,3,3,3,1,2,3],
'sex': [f,f,f,f,f,f,f,m,m,m]}
df = pd.DataFrame(data=data)

df['age1'] = pd.Categorical(df['age'],categories=[3,2,1],ordered=True)
df['sex1'] = pd.Categorical(df['sex'],categories=[m,f],ordered=True)
pd.pivot_table(df,values='num',index='age1',columns='sex1',aggfunc='count',margins=True)

输出(边距顺序不正确,“所有”总和不在正确的行或列中):

sex1  male  female  All
age1
3 1 4 2
2 1 2 3
1 1 1 5
All 7 3 10

预期输出(正确的边距顺序):

sex1  male  female  All
age1
3 1 4 5
2 1 2 3
1 1 1 2
All 3 7 10

在本例中,最好使用 ordered=False 创建类别。然而,我的大部分数据都是自动排序的(使用 pd.cut),所以我想知道这是否是预期行为,如果是,是否有办法删除使用订单创建的类别的排序?

编辑- 这是一个使用 pd.cut 的示例。我更改了“年龄”列的值,使其与剪辑顺序相反。

import pandas as pd
m='male'
f='female'
data = {'num': [0,1,2,3,4,5,6,7,8,9],
'age': [3,3,3,3,2,2,1,1,2,3],
'sex': [f,f,f,f,f,f,f,m,m,m]}
df = pd.DataFrame(data=data)
df['cut'] = pd.cut(df['age'],[1,2,3,4],labels=['<2','2','>2'],right=False)
pd.pivot_table(df,values='num',index='cut',columns='sex',aggfunc='count',margins=True)

输出,行边距也不正确(对应于 pd.cut 中的有序类别)。

sex  female  male  All
cut
<2 1 1 5
2 2 1 3
>2 4 1 2
All 7 3 10

预期输出将是正确的行边距顺序。

sex  female  male  All
cut
<2 1 1 2
2 2 1 3
>2 4 1 5
All 7 3 10

最佳答案

这是针对您的原始问题的修复。从 df['age1']df['sex1']

中移除有序参数

我的改变:

import pandas as pd
m = 'male'
f = 'female'

data = {'num': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
'age': [1, 2, 2, 3, 3, 3, 3, 1, 2, 3],
'sex': [f, f, f, f, f, f, f, m, m, m]}
df = pd.DataFrame(data=data)

df['age1'] = pd.Categorical(df['age'], categories=[3, 2, 1])
df['sex1'] = pd.Categorical(df['sex'], categories=[m, f])
pd.pivot_table(df, values='num', index='age1',
columns='sex1', aggfunc='count', margins=True)

输出:

sex  male   female  All
age1
3 1 4 5
2 1 2 3
1 1 1 2
All 3 7 10

来自docs :此分类是否被视为有序分类。如果为 True,将对生成的分类进行排序。 一个有序的分类方面,排序时,其类别属性的顺序

所以看起来当您将 ordered=True 传递给 pd.Categorical 时,数据透视表不会根据类别对聚合进行排序,但变量会出现在您的数据框中。如果您查看您的数据框,女性先于男性出现,因此下令将保留该类型以供汇总。

因此,为了回答您的问题,这是 ordered 的预期行为,如果您要在脚本中的其他位置对数据框进行排序,则应小心执行此操作。

关于python - pandas 数据透视表 - 导致意外边距的有序类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54582252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com