代码之家  ›  专栏  ›  技术社区  ›  Andrew

将pandas数据帧从分类改为计数

  •  2
  • Andrew  · 技术社区  · 9 年前

    以下是我所拥有的:

       ID Animal
        foo cat
        foo dog
        bar cat
        baz cat
        biz dog
        biz cow
        biz dog
    

    以下是我想要的:

    ID  cat dog cow
    foo 1   1   0
    bar 1   0   0
    baz 1   0   0
    biz 0   1   2
    

    我试过:

    df.groupby(by='ID').count()
    

    Index Animal
    foo 2
    bar 1
    baz 1
    biz 3
    

    我还尝试了:

    df.pivot_table(values='Animal')
    df.stack(level='Animal')
    

    2 回复  |  直到 9 年前
        1
  •  6
  •   MaxU - stand with Ukraine    9 年前

    我们可以使用 crosstab()

    In [17]: pd.crosstab(df.ID, df.Animal).rename_axis(None, axis=1)
    Out[17]:
         cat  cow  dog
    ID
    bar    1    0    0
    baz    1    0    0
    biz    0    1    2
    foo    1    0    1
    
        2
  •  3
  •   Scott Boston    9 年前

    .str.get_dummies , sum 具有 level=0 groupby 具有 总和

    选项1

    df.set_index('ID')['Animal'].str.get_dummies().sum(level=0)
    

    选项2

    df.set_index('ID')['Animal'].str.get_dummies().groupby('ID').sum()
    

         cat  cow  dog
    ID                
    bar    1    0    0
    baz    1    0    0
    biz    0    1    2
    foo    1    0    1
    

    选项3

    df.set_index(['ID','Animal'],append=True).assign(count=1)['count'].unstack(fill_value=0).sum(level=1)
    
    Animal  cat  cow  dog
    ID                   
    bar       1    0    0
    baz       1    0    0
    biz       0    1    2
    foo       1    0    1
    

    使用pivot_表并分配:

     pd.pivot_table(df.assign(count=1),values='count',index='ID',columns='Animal',aggfunc='sum',fill_value=0)
    
    Animal  cat  cow  dog
    ID                   
    bar       1    0    0
    baz       1    0    0
    biz       0    1    2
    foo       1    0    1