如何基于结构分割Pandas DataFrame并为数据集添加标识
解决方案
核心思路
要实现带标识的数据集映射,需结合resumeCol中的字符串列位置信息,将分割后的数值列范围与对应标识(从Excel表头或指定位置提取)关联。核心步骤:
- 分割数值列的连续区间
- 匹配每个区间对应的字符串标识(从DataFrame中提取)
- 生成
{标识: 列索引列表}的映射
优化后的实现代码
def get_labeled_datasets(self, df, resumeCol): number_cols = resumeCol['number'] if not number_cols: return {} # 分割数值列的连续块 blocks = [] current_start = number_cols[0] for i in range(1, len(number_cols)): if number_cols[i] != number_cols[i-1] + 1: blocks.append([current_start, number_cols[i-1]]) current_start = number_cols[i] blocks.append([current_start, number_cols[-1]]) string_cols = sorted(resumeCol['string']) labeled_blocks = {} # 处理第一个数值块 first_start, first_end = blocks[0] # 找第一个块之前的最近字符串列 prev_str_cols = [col for col in string_cols if col < first_start] if prev_str_cols: label_col = max(prev_str_cols) label = str(df.iloc[0, label_col]) # 取行0(表头)的内容作为标识 else: # 无前置字符串列时,用第一个数值列的表头作为标识 label = str(df.iloc[0, first_start]) labeled_blocks[label] = list(range(first_start, first_end + 1)) # 处理后续数值块 for idx in range(1, len(blocks)): prev_block_end = blocks[idx-1][1] curr_start, curr_end = blocks[idx] # 找两个块之间的字符串列 middle_str_cols = [col for col in string_cols if prev_block_end < col < curr_start] if middle_str_cols: label_col = middle_str_cols[0] label = str(df.iloc[0, label_col]) else: # 无中间字符串列时,使用默认命名 label = f"Sample {idx + 1}" labeled_blocks[label] = list(range(curr_start, curr_end + 1)) return labeled_blocks
使用示例
假设已通过pandas读取Excel数据到df,直接调用函数即可生成目标映射:
import pandas as pd # 读取Excel文件 df = pd.read_excel("your_data.xlsx") # 生成带标识的数据集映射 result = self.get_labeled_datasets(df, resumeCol) print(result) # 输出示例: {'Sample A': [1,2,...,16], 'Sample B': [20,...,37]}
可调整项
- 若标识不在表头(行0),修改
df.iloc[0, label_col]中的行索引即可 - 若字符串列的匹配逻辑需要调整(比如取后续字符串列),修改字符串列的筛选条件即可
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

