遍历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)
代码说明
- 分组标记:用
df['measurement'].isna().cumsum()生成分组ID,每遇到一个NaN,分组ID自动加1,确保连续的非NaN行被归为同一组。 - 筛选有效行:通过
dropna(subset=['measurement'])剔除所有含NaN的行,只保留有有效测量值的数据。 - 构建目标字典:遍历每个分组,将分组首行的
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
相关产品推荐
相关产品推荐

