You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:00:57