当dtype为分类时,结果与pandas groupby和pivot_table不同

时间:2018-07-31 20:53:09

标签: python pandas

我今天早些时候在使用pd.cut对值列进行分类之后创建数据透视表时遇到了这个问题。创建数据透视表时,我发现后续索引不正确。当使用groupby或将category列转换为其他dtype之后,这不是问题。

简化示例:

df = pd.DataFrame({'l1': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b']
                   , 'g1': [1, 1, 2, 2, 1, 1, 1, 2, 2, 2]
                   , 'vals': [3, 1, 3, 1, 3, 2, 2, 3, 2, 2]})
df['l2'] = pd.cut(df.vals, bins=[0, 2, 4], labels=['l', 'h'])
df = df[['l1', 'l2', 'g1', 'vals']]

使用groupby

df.groupby(['l1', 'l2', 'g1']).vals.agg(('sum', 'count')).unstack()[['count', 'sum']]

         count   sum   
g1        1  2   1  2
l1 l2                
a  l      1  1   1  1
   h      1  1   3  3
b  l      2  2   4  4
   h      1  1   3  3   

使用pd.pivot_table

pd.pivot_table(df, index=['l1', 'l2'], columns='g1', aggfunc=('sum', 'count'))

         vals          
         count   sum   
g1        1  2   1  2
l1 l2                
a  h      1  1   1  1
   l      1  1   3  3
b  h      2  2   4  4
   l      1  1   3  3

pd.pivot_table列转换为l2 dtype后使用str

df2 = df.copy()
df2['l2'] = df2.l2.astype(str)
pd.pivot_table(df2, index=['l1', 'l2'], columns='g1', aggfunc=('sum', 'count'))

         vals          
         count  sum   
g1        1  2   1  2
l1 l2                
a  h      1  1   3  3
   l      1  1   1  1
b  h      1  1   3  3
   l      2  2   4  4

最后一个示例中的顺序颠倒了,但是值是正确的(与中间示例相反,在中间的示例中顺序颠倒了并且值不正确)。

0 个答案:

没有答案