如何按DataFrame文件名从大型列表中按传感器分组提取子集?
按传感器编号分组DataFrame列表的解决方案
这个需求其实很好解决,核心思路就是从每个DataFrame的文件名里提取传感器编号(比如SE1、SE2),然后用字典把同一传感器的三个深度DataFrame归到一起。我给你两种常见场景的实现方法:
场景1:DataFrame存储在字典中(键为文件名)
如果你的450个DataFrame是存在一个字典里的——键是文件名,值是对应的DataFrame,那可以这么做:
# 假设你的DataFrames字典是这样的(示例) dfs_dict = { 'ALL_SM51_SE1_hourly': df_se1_5cm, 'ALL_SM201_SE1_hourly': df_se1_20cm, 'ALL_SM501_SE1_hourly': df_se1_50cm, # ... 剩下的447个DataFrame } # 初始化空字典用于存分组结果 sensor_groups = {} # 遍历所有DataFrame for file_name, df in dfs_dict.items(): # 从文件名里提取传感器编号:拆分字符串后取第3段(索引2) sensor_id = file_name.split('_')[2] # 如果这个传感器还没在分组字典里,先创建空列表 if sensor_id not in sensor_groups: sensor_groups[sensor_id] = [] # 把当前DataFrame加入对应传感器的列表 sensor_groups[sensor_id].append(df)
运行后,sensor_groups['SE1']就是包含SE1三个深度DataFrame的列表,sensor_groups['SE2']对应SE2的,以此类推。
场景2:DataFrame存储在列表中(带name属性)
如果你的DataFrame是存在一个列表里,且每个DataFrame都有name属性对应它的文件名,那代码可以调整成这样:
# 假设你的DataFrame列表是这样的(示例) df_list = [df_se1_5cm, df_se1_20cm, df_se1_50cm, ...] # 每个df的name属性比如是 'ALL_SM51_SE1_hourly' sensor_groups = {} for df in df_list: # 从df的name属性里提取传感器编号 sensor_id = df.name.split('_')[2] if sensor_id not in sensor_groups: sensor_groups[sensor_id] = [] sensor_groups[sensor_id].append(df)
优化写法:用defaultdict简化代码
如果你不想每次都判断传感器是否存在,可以用collections.defaultdict来简化:
from collections import defaultdict sensor_groups = defaultdict(list) # 不管是字典还是列表场景,遍历逻辑类似,以字典为例: for file_name, df in dfs_dict.items(): sensor_id = file_name.split('_')[2] sensor_groups[sensor_id].append(df)
按顺序提取子列表(SE1到SE150)
如果需要得到一个按SE1到SE150顺序排列的子列表集合,可以这样生成:
sorted_sensor_lists = [sensor_groups[f'SE{i}'] for i in range(1, 151)]
现在sorted_sensor_lists[0]就是SE1的三个DataFrame,sorted_sensor_lists[1]是SE2的,直到第149个元素对应SE150的DataFrame列表。
注意事项
如果你的DataFrame列表里没有存储文件名,那建议在创建列表的时候把文件名和DataFrame存成元组,比如:
df_list = [('ALL_SM51_SE1_hourly', df_se1_5cm), ('ALL_SM201_SE1_hourly', df_se1_20cm), ...]
然后遍历的时候取元组的第一个元素作为文件名即可。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

