计算空值

1 投票
1 回答
30 浏览
提问于 2025-04-12 21:53

我有一个表格,想要知道里面有多少个空值,但遇到了一个意外的错误。

下面是这个表格:

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'。

我确实有'isp_name'这一列,但我不知道为什么会出现这个问题。

谢谢

1 个回答

0

在你用 df['end_time'].isnull() 进行筛选后,你只得到了一个系列(Series),这时候 isp_name 这一列就不见了。

你需要用这个系列来进行分组:

df['end_time'].isnull().groupby(df['isp_name']).sum() 

或者你可以使用一个自定义的聚合函数:

df.groupby('isp_name')['end_time'].agg(lambda x: x.isnull().sum())

输出结果:

isp_name
ISP A    2
ISP B    6
ISP C    3
ISP D    4
ISP E    3
Name: end_time, dtype: int64

最后一个选项,提供更多灵活性,你可以用 assign 来添加一个新列:

(df.assign(non_null=lambda d: d['end_time'].isnull())
   .groupby('isp_name')['non_null'].sum()
)

撰写回答