Pandas DataFrame上的多个分组

时间:2015-03-18 01:04:16

标签: python pandas

原谅任何不好的措辞,因为我对熊猫很新。我已经做了相当多的谷歌搜索,但无法弄清楚我需要的关键字,以获得我正在寻找的答案。我有一些相当简单的数据,包含按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,并可以选择为每个不同的分组定义不同的标准。

如果需要,很高兴进一步澄清。我最初尝试对此进行编码已经充满了错误,因此我认为到目前为止发布进度并没有多大好处。事实上,我只是想写一些东西,它似乎更有误导性而不是有用。抱歉,> _<。

1 个答案:

答案 0 :(得分:2)

IIUC,你可以先做一个groupby,然后建立一个pivot_table来获得你想要的东西:

[原始版本]

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 - 但使用此模式非常容易。