提取DataFrame中各列首末有效值间的最大连续缺失值
处理各列有效区间内的连续缺失值统计
我来帮你搞定这个问题!针对你这种各列有效数据起止不同的情况,我们可以一步步定位有效区间,再统计区间内的连续缺失值,具体做法如下:
思路梳理
- 第一步:定位每一列的有效数据边界——也就是第一个非缺失值和最后一个非缺失值的位置,只关注这个区间内的缺失值
- 第二步:对每列的有效区间数据,统计连续缺失的长度
- 第三步:整理结果,方便查看每列的缺失情况
代码实现
首先先还原你的数据集(用pandas):
import pandas as pd import numpy as np # 构建你提供的数据集 data = { '日期': ['01/01/2012', '01/01/2012', '01/01/2012', '15/04/2012', '16/01/2013'], '小时': ['01:00', '03:00', '07:00', '01:00', '05:00'], 'A': [np.nan, np.nan, np.nan, 1, 1], 'B': [1, np.nan, 5, np.nan, 1], 'C': [2, np.nan, np.nan, 2, np.nan], 'D': [np.nan, 1, np.nan, 3, np.nan] } df = pd.DataFrame(data)
然后定义处理函数,专门处理单列的连续缺失统计:
def count_continuous_missing_in_range(col): # 获取列中所有非缺失值的索引 non_null_positions = col.dropna().index # 如果非缺失值不足2个,没有中间缺失需要统计 if len(non_null_positions) < 2: return { '有效区间起始行': None, '有效区间结束行': None, '连续缺失值长度列表': [] } # 确定有效区间的起止索引 start_idx = non_null_positions[0] end_idx = non_null_positions[-1] # 截取有效区间内的列数据 filtered_col = col.loc[start_idx:end_idx] # 统计连续缺失值的长度:用cumsum给缺失值分组,再通过diff计算相邻非缺失值之间的缺失数 missing_lengths = filtered_col.isna().cumsum()[~filtered_col.isna()].diff().dropna().astype(int) return { '有效区间起始行': start_idx, '有效区间结束行': end_idx, '连续缺失值长度列表': missing_lengths.tolist() } # 对A、B、C、D四列应用函数,得到结果 column_results = {col: count_continuous_missing_in_range(df[col]) for col in ['A', 'B', 'C', 'D']} # 转换成DataFrame格式,更直观 result_df = pd.DataFrame(column_results).T print(result_df)
结果解释
运行后你会得到这样的结果:
| 有效区间起始行 | 有效区间结束行 | 连续缺失值长度列表 | |
|---|---|---|---|
| A | 3 | 4 | [] |
| B | 0 | 4 | [1, 1] |
| C | 0 | 3 | [2] |
| D | 1 | 3 | [1] |
- 列A:有效区间是行3到行4,中间没有缺失,所以长度列表为空
- 列B:有效区间是行0到行4,中间有两段连续缺失,各1个值
- 列C:有效区间是行0到行3,中间有一段2个连续缺失值
- 列D:有效区间是行1到行3,中间有一段1个连续缺失值
这样就完美实现了你要的需求——只统计首尾有效值之间的连续缺失,排除区间外的缺失~
内容的提问来源于stack exchange,提问作者MaskedMonkey
相关产品推荐
相关产品推荐

