对数据帧进行分组并计算未显示的列的项目数量

时间:2017-06-21 21:05:59

标签: python pandas

好吧,我承认,我真的很难为此制定一个好的标题。所以我会试着举个例子。

这是我的示例数据框:

adfree

我用它做的是:

df = pd.DataFrame([
(1,"a","good"),
(1,"a","good"),
(1,"b","good"),
(1,"c","bad"),
(2,"a","good"),
(2,"b","bad"),
(3,"a","none")], columns=["id", "type", "eval"])

这导致:

df.groupby(["id", "type"])["id"].agg({'id':'count'})

这很好,虽然我稍后需要的是,例如id会在每一行中重复出现。但这不是最重要的部分。

我现在需要的是这样的事情:

        id
id type
1  a     2
   b     1
   c     1
2  a     1
   b     1
3  a     1

更好的是这样的结果,因为我需要在数据框中(最后在Excel工作表中)填充所有字段。实际上,我将分组更多的专栏。它们也必须完全填充。

        id good bad none
id type
1  a     2    2   0    0
   b     1    1   0    0
   c     1    0   1    0
2  a     1    1   0    0
   b     1    0   1    0
3  a     1    0   0    1

感谢您帮助我。

1 个答案:

答案 0 :(得分:2)

您可以使用groupby + size(已添加最后一栏)或value_countsunstack

df1 = df.groupby(["id", "type", 'eval'])
        .size()
        .unstack(fill_value=0)
        .rename_axis(None, axis=1)
print (df1)
         bad  good  none
id type                 
1  a       0     2     0
   b       0     1     0
   c       1     0     0
2  a       0     1     0
   b       1     0     0
3  a       0     0     1
df1 = df.groupby(["id", "type"])[ 'eval']
        .value_counts()
        .unstack(fill_value=0)
        .rename_axis(None, axis=1)
print (df1)
         bad  good  none
id type                 
1  a       0     2     0
   b       0     1     0
   c       1     0     0
2  a       0     1     0
   b       1     0     0
3  a       0     0     1

但是为了写excel得到:

df1.to_excel('file.xlsx')

pic

最后需要reset_index

df1.reset_index().to_excel('file.xlsx', index=False)

pic1

编辑:

我忘记了id列,但它是重复的列名,因此需要id1

df1.insert(0, 'id1', df1.sum(axis=1))