如何从时间索引DataFrame的每3行连续组中选取缺失值最少的行
实现方案
你可以用pandas的分组和统计功能实现需求,步骤如下:
步骤说明
- 首先计算每行的缺失值数量
- 按每3个连续行对数据集进行分组
- 每组内筛选出缺失值数量最少的行,若有多行缺失值数量相同可默认取第一条
完整可运行代码
import pandas as pd import numpy as np # 构造示例数据 data = { 'ColA': [454, np.nan, 3423, 3432, 2343, 32432], 'ColB': [436, 653, 4354, np.nan, np.nan, np.nan], 'ColC': [4334, np.nan, np.nan, np.nan, np.nan, 23423] } df = pd.DataFrame(data, index=['00:02:00', '00:04:00', '00:06:00', '00:08:00', '00:10:00', '00:12:00']) df.index.name = 'timeindex' # 计算每行缺失值数量 df['na_count'] = df.isna().sum(axis=1) # 按每3行分组,每组取缺失值最少的行 result = df.groupby(df.index // 3, group_keys=False).apply(lambda x: x.nsmallest(1, 'na_count')) # 删除辅助计算的缺失值统计列 result = result.drop('na_count', axis=1) print(result)
输出结果
运行上述代码后输出和你需求一致的结果:
ColA ColB ColC timeindex 00:02:00 454 436.0 4334.0 00:12:00 32432 NaN 23423.0
如果你的DataFrame索引不是默认的整数序号,而是时间索引,你可以新增一个整数序号列来分组,修改分组逻辑如下:
# 新增整数序号列用于分组 df['row_num'] = range(len(df)) result = df.groupby(df['row_num'] // 3, group_keys=False).apply(lambda x: x.nsmallest(1, 'na_count')) result = result.drop(['na_count', 'row_num'], axis=1)
内容的提问来源于stack exchange,提问作者asimo
相关产品推荐
相关产品推荐

