Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按级别计数聚合数据,设置每个级别';s算作它自己的列?_Python_Pandas_Aggregate - Fatal编程技术网

Python 如何按级别计数聚合数据,设置每个级别';s算作它自己的列?

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 | -----------------------

我的数据在事件方面具有行粒度,我希望通过客户ID对其进行聚合。数据的形式为df,如下所示:

| 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你介意这个解决方案吗。