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

遍历DataFrame生成字典:遇measurement为NaN则新建条目

问题描述

我有一个包含三列的DataFrame:

  • 第一列为"x",数值呈周期性升降(如[1,2,3,4,5,4,3,2,1,2,3,…])
  • 第二列为"time"
  • 第三列为"measurement",多数行是浮点数值,但在周期首尾会出现若干NaN值(且NaN对应的"x"行不固定)

示例数据如下:

import pandas as pd
df = pd.DataFrame([[1, 'time1', ], [2, 'time2', ], [3, 'time3', 3], [4, 'time4', 5], [5, 'time5', 4], [6, 'time6', ], [5, 'time7', ], [4, 'time8', 3], [3, 'time9', 2], [2, 'time10', ], [1, 'time11', ], [2, 'time12', 4], [3, 'time13', 5], [4, 'time14', 6], [5, 'time15', 3], [6, 'time16', ], [5, 'time17', ], [4, 'time18', 3], [3, 'time19', 3]], columns=['x', 'time', 'measurement'])

需要生成一个新字典:

  • 字典的键为每个连续非NaN测量段的第一个非NaN行对应的"time"值
  • 字典的值为两个列表组成的元组,分别对应该段的"x"数值和对应的"measurement"数值
  • 每当遇到"measurement"为NaN时,结束当前段,从下一个非NaN"measurement"的行开始新建字典条目

预期结果示例:

nice_dict = {'time3':([3, 4, 5],[3, 5, 4]), 'time8':([4, 3],[3, 2]), 'time12':([2, 3, 4, 5],[4, 5, 6, 3]), 'time18':([4, 3],[3, 3])}
解决方案

可以通过标记连续非NaN段的分组ID,再按分组处理生成目标字典:

import pandas as pd

# 标记每个连续非NaN测量段的分组ID
df['group'] = df['measurement'].isna().cumsum()

# 筛选有效测量行并按分组聚合
valid_groups = df.dropna(subset=['measurement']).groupby('group')

nice_dict = {}
for _, group in valid_groups:
    # 取分组首行的time作为字典键
    key = group['time'].iloc[0]
    # 提取x和measurement的列表组成元组作为值
    value = (group['x'].tolist(), group['measurement'].tolist())
    nice_dict[key] = value

print(nice_dict)

代码说明

  1. 分组标记:用df['measurement'].isna().cumsum()生成分组ID,每遇到一个NaN,分组ID自动加1,确保连续的非NaN行被归为同一组。
  2. 筛选有效行:通过dropna(subset=['measurement'])剔除所有含NaN的行,只保留有有效测量值的数据。
  3. 构建目标字典:遍历每个分组,将分组首行的time作为键,分组内的x和measurement转为列表组成元组作为值,存入字典。

运行后输出结果:

{'time3': ([3, 4, 5], [3.0, 5.0, 4.0]), 'time8': ([4, 3], [3.0, 2.0]), 'time12': ([2, 3, 4, 5], [4.0, 5.0, 6.0, 3.0]), 'time18': ([4, 3], [3.0, 3.0])}

如果需要将measurement的浮点值转为整型(和示例格式完全一致),可以修改值的生成逻辑:

value = (group['x'].tolist(), [int(num) for num in group['measurement'].tolist()])

内容的提问来源于stack exchange,提问作者Bas R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:10:27