原谅任何不好的措辞,因为我对熊猫很新。我已经做了相当多的谷歌搜索,但无法弄清楚我需要的关键字,以获得我正在寻找的答案。我有一些相当简单的数据,包含按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,并可以选择为每个不同的分组定义不同的标准。
如果需要,很高兴进一步澄清。我最初尝试对此进行编码已经充满了错误,因此我认为到目前为止发布进度并没有多大好处。事实上,我只是想写一些东西,它似乎更有误导性而不是有用。抱歉,> _<。
答案 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
- 但使用此模式非常容易。