计算DataFrame各ISP的end_time空值数时触发KeyError问题求助
按ISP分组统计网络中断结束时间空值数量的KeyError问题
我有一张记录网络中断信息的数据表,想要按isp_name分组统计end_time列的空值数量,但执行代码时出现KeyError: 'isp_name',尽管数据表中确实存在该列。
数据表如下:
outage_id isp_name start_time end_time affected_area reported_issues 1 ISP D 2023-01-01 00:00:00 2023-01-01 01:00:00 Area 6 39 2 ISP E 2023-01-01 01:00:00 2023-01-01 05:00:00 Area 3 47 3 ISP C 2023-01-01 02:00:00 2023-01-01 03:00:00 Area 4 60 4 ISP E 2023-01-01 03:00:00 2023-01-01 04:00:00 Area 4 63 5 ISP E 2023-01-01 04:00:00 NULL Area 3 17 6 ISP B 2023-01-01 05:00:00 2023-01-01 06:00:00 Area 3 36 7 ISP C 2023-01-01 06:00:00 NULL Area 3 36 8 ISP C 2023-01-01 07:00:00 NULL Area 4 30 9 ISP C 2023-01-01 08:00:00 2023-01-01 09:00:00 Area 7 39 10 ISP E 2023-01-01 09:00:00 2023-01-01 12:00:00 Area 4 37 11 ISP D 2023-01-01 10:00:00 2023-01-01 11:00:00 Area 9 73 12 ISP C 2023-01-01 11:00:00 2023-01-01 13:00:00 Area 1 78 13 ISP E 2023-01-01 12:00:00 NULL Area 8 70 14 ISP B 2023-01-01 13:00:00 2023-01-01 17:00:00 Area 7 57 15 ISP D 2023-01-01 14:00:00 2023-01-01 15:00:00 Area 2 28 16 ISP B 2023-01-01 15:00:00 NULL Area 8 13 17 ISP D 2023-01-01 16:00:00 2023-01-01 20:00:00 Area 1 44 18 ISP E 2023-01-01 17:00:00 2023-01-01 21:00:00 Area 9 73 19 ISP A 2023-01-01 18:00:00 2023-01-01 21:00:00 Area 9 58 20 ISP D 2023-01-01 19:00:00 2023-01-01 22:00:00 Area 2 26 21 ISP B 2023-01-01 20:00:00 NULL Area 7 53 22 ISP E 2023-01-01 21:00:00 2023-01-01 22:00:00 Area 3 39 23 ISP D 2023-01-01 22:00:00 2023-01-02 01:00:00 Area 7 55 24 ISP A 2023-01-01 23:00:00 2023-01-02 02:00:00 Area 9 15 25 ISP A 2023-01-02 00:00:00 NULL Area 4 46 26 ISP C 2023-01-02 01:00:00 2023-01-02 03:00:00 Area 1 33 27 ISP C 2023-01-02 02:00:00 NULL Area 2 55 28 ISP B 2023-01-02 03:00:00 NULL Area 1 62 29 ISP D 2023-01-02 04:00:00 NULL Area 5 69 30 ISP D 2023-01-02 05:00:00 2023-01-02 09:00:00 Area 5 72 31 ISP C 2023-01-02 06:00:00 2023-01-02 10:00:00 Area 7 94 32 ISP D 2023-01-02 07:00:00 2023-01-02 10:00:00 Area 9 41 33 ISP D 2023-01-02 08:00:00 2023-01-02 11:00:00 Area 9 96 34 ISP A 2023-01-02 09:00:00 2023-01-02 13:00:00 Area 3 42 35 ISP C 2023-01-02 10:00:00 2023-01-02 13:00:00 Area 3 76 36 ISP E 2023-01-02 11:00:00 2023-01-02 13:00:00 Area 3 27 37 ISP C 2023-01-02 12:00:00 2023-01-02 14:00:00 Area 4 34 38 ISP E 2023-01-02 13:00:00 2023-01-02 14:00:00 Area 8 63 39 ISP A 2023-01-02 14:00:00 NULL Area 6 67 40 ISP B 2023-01-02 15:00:00 2023-01-02 19:00:00 Area 8 76 41 ISP D 2023-01-02 16:00:00 NULL Area 1 55
我尝试的代码:
df.end_time.isnull().groupby('isp_name').sum() # or df.end_time.isnull().groupby('isp_name').transform('sum')
执行后报错KeyError: 'isp_name'。
问题原因
df.end_time.isnull()返回的是一个Series对象,仅包含end_time列的空值判断结果(布尔值),已经丢失了原DataFrame中的isp_name列信息。直接对这个Series调用groupby('isp_name')时,因为Series里没有该列,所以会抛出KeyError。
正确解决方案
需要先按isp_name分组原DataFrame,再统计每组中end_time的空值数量,以下是几种实现方式:
方式1:先分组再用apply聚合
df.groupby('isp_name')['end_time'].apply(lambda x: x.isnull().sum())
方式2:使用agg方法更简洁
df.groupby('isp_name')['end_time'].agg(lambda x: x.isnull().sum())
方式3:保留分组列后再统计
如果非要先获取空值判断结果,需要同时保留isp_name列,再分组求和:
df[['isp_name', 'end_time']].assign(is_null=df.end_time.isnull()).groupby('isp_name')['is_null'].sum()
方式4:布尔索引结合value_counts
直接筛选出end_time为空的行,再统计各ISP的数量:
df[df.end_time.isnull()]['isp_name'].value_counts()
内容的提问来源于stack exchange,提问作者jingchun liu
相关产品推荐
相关产品推荐

