我有一个看起来像--p的数据集(大约20万行)
timestamp,cell_id,crnti,enodeb_id,cqi,
1603208435646,3,39062,21519,1,
1603208435946,3,39063,21519,1,
1603208435146,3,39064,21519,2,
1603208435346,3,39064,21519,1,
1603208435546,3,39065,21519,3,
1603208435746,3,39065,21519,1,
1603208435846,3,39062,21519,1,
1603208435946,3,39065,21519,1,
我要汇总所有记录(按crnti格式)-
cell_id,crnti,enodeb_id,cqi,distance_km,session_duration
此处,使用时间戳记为每个crnti计算会话持续时间。因此,以crnti = 39065为例,有3条记录,因此session_duration(第一条记录和最后一条记录的差值)= 1603208435946-1603208435546 = 400毫秒 等等。 cqi是平均所有cqi值= AVG(3,1,1)= 1.66
对于只有一条记录的crnti,会话持续时间默认为4秒
cell_id,crnti,enodeb_id,cqi,session_duration(msec)
3,39065,21519,1.66,400
3,39062,21519,1,4000
如何以有效的方式在熊猫中做到这一点。我一直在考虑使用循环,但这似乎效率很低。请告知。
答案 0 :(得分:0)
将GroupBy.agg
与命名聚合一起使用,然后使用DataFrame.pop
减去最大和最小值以用于丢弃列,并且如果DataFrame.loc
的计数为4000
,则设置1
:
df = df.groupby(['cell_id','crnti','enodeb_id']).agg(cqi = ('cqi','mean'),
first = ('timestamp', 'min'),
last = ('timestamp','max'),
count = ('cqi', 'size'))
df['session_duration(msec)'] = df.pop('last').sub(df.pop('first'))
df.loc[df.pop('count').eq(1), 'session_duration(msec)'] = 4000
df = df.reset_index()
print (df)
cell_id crnti enodeb_id cqi session_duration(msec)
0 3 39062 21519 1.000000 200
1 3 39063 21519 1.000000 4000
2 3 39064 21519 1.500000 200
3 3 39065 21519 1.666667 400