好吧,我承认,我真的很难为此制定一个好的标题。所以我会试着举个例子。
这是我的示例数据框:
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
感谢您帮助我。
答案 0 :(得分:2)
您可以使用groupby
+ size
(已添加最后一栏)或value_counts
与unstack
:
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')
最后需要reset_index
。
df1.reset_index().to_excel('file.xlsx', index=False)
编辑:
我忘记了id
列,但它是重复的列名,因此需要id1
:
df1.insert(0, 'id1', df1.sum(axis=1))