Python 如何按级别计数聚合数据,设置每个级别';s算作它自己的列?
我的数据在事件方面具有行粒度,我希望通过客户ID对其进行聚合。数据的形式为df,如下所示:Python 如何按级别计数聚合数据,设置每个级别';s算作它自己的列?,python,pandas,aggregate,Python,Pandas,Aggregate,我的数据在事件方面具有行粒度,我希望通过客户ID对其进行聚合。数据的形式为df,如下所示: | Event ID | Cust ID | P1 | P2 | P3 | P4 | ------------------------------------------ | 1 | 1 | 12 | 0 | 0 | 0 | -------------------------- | 2 | 1 | 12 | 0 | 0 | 0 | -----------------------
| Event ID | Cust ID | P1 | P2 | P3 | P4 |
------------------------------------------
| 1 | 1 | 12 | 0 | 0 | 0 |
--------------------------
| 2 | 1 | 12 | 0 | 0 | 0 |
--------------------------
| 3 | 1 | 10 | 12 | 0 | 0 |
---------------------------
| 4 | 2 | 206 | 0 | 0 | 0 |
---------------------------
| 5 | 2 | 206 | 25 | 0 | 0 |
----------------------------
P1到P4的数字只是级别,它们是我需要获得计数的事件类别(有175+个代码),其中每个事件类别都有自己的列
理想情况下,我想要的输出如下所示:
| Cust ID | Count(12) | Count(10) | Count(25) | Count(206) |
------------------------------------------------------------
| 1 | 3 | 1 | 0 | 0 |
---------------------
| 2 | 0 | 0 | 1 | 2 |
---------------------
我面临的挑战是跨多个列进行计数。P1中有2个'12',P2中有1个'12'
我试着使用groupby和merge。但我要么使用错误,要么使用错误的函数,因为结果表中有很多“NaN”。您可以使用以下方法:
df = pd.DataFrame({'Event ID':[1,2,3,4,5],
'Cust ID':[1]*3+[2]*2,
'P1':[12,12,10,206,25],
'P2':[0,0,12,0,0],
'P3':[0]*5,
'P4':[0]*5})
df.melt(['Event ID','Cust ID'])\
.groupby('Cust ID')['value'].value_counts()\
.unstack().add_prefix('Count_')\
.reset_index()
输出:
value Cust ID Count_0 Count_10 Count_12 Count_25 Count_206
0 1 8.0 1.0 3.0 NaN NaN
1 2 6.0 NaN NaN 1.0 1.0
您可以使用以下方法:
df = pd.DataFrame({'Event ID':[1,2,3,4,5],
'Cust ID':[1]*3+[2]*2,
'P1':[12,12,10,206,25],
'P2':[0,0,12,0,0],
'P3':[0]*5,
'P4':[0]*5})
df.melt(['Event ID','Cust ID'])\
.groupby('Cust ID')['value'].value_counts()\
.unstack().add_prefix('Count_')\
.reset_index()
输出:
value Cust ID Count_0 Count_10 Count_12 Count_25 Count_206
0 1 8.0 1.0 3.0 NaN NaN
1 2 6.0 NaN NaN 1.0 1.0
您可以执行
melt(['Event ID','Cust ID'])
,然后执行groupby().value\u counts()
。此函数有效。非常感谢。您可以执行melt(['Event ID','Cust ID'])
,然后执行groupby().value\u counts()
。此函数有效。非常感谢。嗨,斯科特,谢谢你的解决方案。它是有效的,但我不完全理解它是如何工作的。你有什么资源可以指向我可以学到更多的地方吗?谢谢@是的,看看我的个人资料。有很好的培训材料。如果你有机会参加特德·佩特罗的课程,我强烈推荐。@KalpakKulkarni你介意这个解决方案吗。嗨,斯科特,谢谢你的解决方案。它是有效的,但我不完全理解它是如何工作的。你有什么资源可以指向我可以学到更多的地方吗?谢谢@是的,看看我的个人资料。有很好的培训材料。如果你有机会参加特德·佩特罗的课程,我强烈推荐。@KalpakKulkarni你介意这个解决方案吗。