汇总大型数据集的数据框中的列

时间:2020-11-06 06:30:06

标签: pandas dataframe

我有一个看起来像--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

如何以有效的方式在熊猫中做到这一点。我一直在考虑使用循环,但这似乎效率很低。请告知。

1 个答案:

答案 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