Python 数据帧上的多个分组
原谅任何不好的措辞,因为我对熊猫很陌生。我已经在谷歌上搜索了相当多的内容,但还不太清楚我需要哪些关键词才能得到我想要的答案。我有一些相当简单的数据,其中包含按ID和日期分组的某个标志的计数,如下所示:Python 数据帧上的多个分组,python,pandas,Python,Pandas,原谅任何不好的措辞,因为我对熊猫很陌生。我已经在谷歌上搜索了相当多的内容,但还不太清楚我需要哪些关键词才能得到我想要的答案。我有一些相当简单的数据,其中包含按ID和日期分组的某个标志的计数,如下所示: id date flag count ------------------------------------- CAZ1 02/03/2012 Y 12 CAZ1 02/03/2012 N 7 CAZ2
id date flag count
-------------------------------------
CAZ1 02/03/2012 Y 12
CAZ1 02/03/2012 N 7
CAZ2 03/03/2012 Y 6
CAZ2 03/03/2012 N 2
CRI2 02/03/2012 Y 14
CRI2 02/03/2012 G 5
LMU3 01/12/2013 G 7
LMU4 02/12/2013 G 4
LMU5 01/12/2014 G 3
LMU6 01/12/2014 G 2
LMU7 05/12/2014 G 2
EUR4 01/16/2014 N 3
我想做的是按照特定的标志组合对ID进行分组,将它们的计数相加,然后得到每年的平均值。结果数据应类似于:
2012 2013 2014 Mean Calculations:
--------------------------------------
Y,N | 6.75 NaN NaN (((12+7)/2)+((6+2)/2))/2
--------------------------------------
Y,G | 9.5 NaN NaN (14+5)/2
--------------------------------------
G | NaN 5.5 2.33 (7+4)/2, (3+2+2)/3
--------------------------------------
N | NaN NaN 3 (3)
不确定这是否有意义。我认为我需要同时执行多个GroupBys,并可以选择为每个不同的分组定义不同的标准
如有需要,欢迎进一步澄清。我最初的编码尝试充满了错误,所以到目前为止,我不认为发布进度有多大好处。事实上,我只是试着写些东西,但它似乎更具误导性,而不是帮助。对不起,IIUC,您可以先执行一个
groupby
,然后构建一个pivot\u表
,得到您想要的:
[原文]
df["date"] = pd.to_datetime(df["date"])
grouped = df.groupby(["id","date"], as_index=False)
df_new = grouped.agg({"flag": ",".join, "count": "sum"})
df_new["year"] = df_new["date"].dt.year
df_final = df_new.pivot_table(index="flag", columns="year")
产生
>>> df_final
count
year 2012 2013 2014
flag
G NaN 5.5 2.333333
N NaN NaN 3.000000
Y,G 19.0 NaN NaN
Y,N 13.5 NaN NaN
[问题编辑后更新]
如果您想要平均值而不是总和,那么在进行聚合时只需编写mean
而不是sum
,即
df_new = grouped.agg({"flag": ",".join, "count": "mean"})
给
>>> df_final
count
year 2012 2013 2014
flag
G NaN 5.5 2.333333
N NaN NaN 3.000000
Y,G 9.50 NaN NaN
Y,N 6.75 NaN NaN
唯一棘手的部分是将字典传递给
agg
,这样我们可以同时执行两个聚合操作:
>>> df_new
id date count flag year
0 CAZ1 2012-02-03 19 Y,N 2012
1 CAZ2 2012-03-03 8 Y,N 2012
2 CRI2 2012-02-03 19 Y,G 2012
3 EUR4 2014-01-16 3 N 2014
4 LMU3 2013-01-12 7 G 2013
5 LMU4 2013-02-12 4 G 2013
6 LMU5 2014-01-12 3 G 2014
7 LMU6 2014-01-12 2 G 2014
8 LMU7 2014-05-12 2 G 2014
通常,尽可能多地使用这些平面格式,然后只在最后进行轴心旋转会更容易
例如,如果您的真实数据集比您发布的数据集更复杂,您可能需要另一个
groupby
——但使用此模式很容易。您已经更改了所需的计算,但我不明白您为什么希望Y,G/2012为19。应该是(14+5)/2吗?是的,你说得对。抱歉。事实上,我完全把自己搞糊涂了,原来的答案/问题更正确(使用sum)。。。但我会让它保持原样,这样如果有人碰到它,它就不会变得太乱。好吧,这让我大部分时间都在那里。。。谢谢最后,它确实提出了一些关于如何透视/过滤/分组df_新数据集的更多问题(我想将所有包含“G”的项目以及其他项目分组,仅单独分组“G”等),但希望我可以按照您的建议使用另一个组/agg来完成这项工作。