在Pandas数据框中的一列上进行多次聚合以返回两列

时间:2019-10-29 19:20:59

标签: python python-3.x pandas dataframe

我有一个Pandas数据框,其中包含以下数据:

df:
eventid, locationid, eventname, eventdate, attended, earlyarrival, exitpolled, pollscomplete, timeframe
1, 12, Event X, 2018-03-14 07:00:00, 1, 1, 1, 3, 2018
2, 14, Event Y, 2017-07-03 07:00:00, 0, 0, 1, 1, 2017
3, 14, Event Z, 2017-07-05 07:00:00, 1, 0, 0, 2, 2017
...

我正在尝试对其进行以下操作以对其进行汇总:

finaloutput = df.groupby([pd.to_datetime(df.eventdate).dt.strftime('%m/%Y'), 'locationid']).agg({'eventid': 'nunique', 'attended':lambda x: (x==1).sum(), 'earlyarrival':lambda x: (x==1).sum(), 'exitpolled':lambda x: (x==1).sum(), 'pollscomplete':lambda x: (x==1).sum(), 'pollscomplete':lambda x: x.eq(1).sum()})

我遇到的问题是我没有为pollscomplete的lambda函数返回两列。我希望同时添加完成的轮询数量和最终数据集中要完成轮询的事件数量。我猜想在聚合时不可能应用两个lambda函数来将两个不同的列返回到数据帧中而不映射它并定义一个新列。这是正确的吗?

当前结果:

eventdate, locationid, eventid, attended, earlyarrival, exitpolled, pollscomplete
2017-07-01, 14, 2, 1, 1, 1
2018-03-14, 12, 1, 1, 1, 1

预期结果:

eventdate, locationid, eventid, attended, earlyarrival, exitpolled, pollscomplete, pollscomplete
2017-07-01, 14, 2, 1, 1, 1, 3
2018-03-14, 12, 1, 1, 1, 1, 3

如上所述,我希望民意测验的完整计数和总和。

1 个答案:

答案 0 :(得分:0)

没关系-对于这个问题,抱歉,我通过将两个lambda函数嵌套到一个列表中来完成此工作。以下是代码-请告诉我是否有更好的方法:

finaloutput = (df.groupby([pd.to_datetime(df.eventdate).dt.strftime('%m/%Y'), 'locationid'])
                  .agg({'eventid': 'nunique', 
                        'attended': lambda x: (x==1).sum(), 
                        'earlyarrival': lambda x: (x==1).sum(), 
                        'exitpolled': lambda x: (x==1).sum(), 
                        'pollscomplete': [lambda x: (x==1).sum(), lambda x: x.eq(1).sum()]
                       }))

关于这件事,唯一奇怪的是,尽管使用了操作,但我所有的列都已重命名为“ lambda”。