2017-06-21 23 views
1

好的,我承认,我有麻烦来真正制定一个好的标题。所以我会试着举个例子。将一个数据框分组并计数一个没有显示的列的项目数

这是我的样本数据框:

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 type 
1 a  2 
    b  1 
    c  1 
2 a  1 
    b  1 
3 a  1 

这是好的,但什么我稍后需要的是例如该id将在每一行重复。但这不是最重要的部分。

我现在需要的是这样的:所有

 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 

更妙会是这样一个结果,因为我需要这个早在数据帧(终于在一个Excel工作表)字段填充。实际上,我将分组更多的专栏。他们也必须完全填充。

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

谢谢你帮助我。

回答

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 

但对于写脱颖而出获得:

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)) 
+1

哇,这个答案是真的我印象深刻。这么快,回答对我来说很重要的一切。非常感谢jezrael! 我的下一个任务是添加C和D之和的另一列,再加上C到E的总和。但我认为,我会自己完成这项工作;-) – SLglider

+0

很高兴能为您提供帮助!将Multiindex写入excel有点麻烦,所以请添加一些图片。 ;) – jezrael

+0

我忘了它,所以把它添加到答案的底部。需要['insert'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.insert.html),因为需要第一列,但是'reset_index'引发错误,所以需要重命名' id'到'id1'。祝你好运! – jezrael

相关问题