Python 数据帧上的多个分组

Python 数据帧上的多个分组,python,pandas,Python,Pandas,原谅任何不好的措辞,因为我对熊猫很陌生。我已经在谷歌上搜索了相当多的内容,但还不太清楚我需要哪些关键词才能得到我想要的答案。我有一些相当简单的数据,其中包含按ID和日期分组的某个标志的计数,如下所示: id date flag count ------------------------------------- CAZ1 02/03/2012 Y 12 CAZ1 02/03/2012 N 7 CAZ2

原谅任何不好的措辞,因为我对熊猫很陌生。我已经在谷歌上搜索了相当多的内容,但还不太清楚我需要哪些关键词才能得到我想要的答案。我有一些相当简单的数据,其中包含按ID和日期分组的某个标志的计数,如下所示:

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来完成这项工作。