识别带有合并表头的Pandas DataFrame中实际数据的起始行
识别带有合并表头的Pandas DataFrame中实际数据的起始行
嘿,我懂你的需求了——要自动找出那些带多行合并表头的DataFrame里,真正开始放数据的行号,而且这个行号还会随不同表格变化对吧?下面给你几个实用的思路和代码方案,你可以根据自己的数据情况调整:
方法一:通过数值型元素占比判断
这种方法适合数据行以数值为主的场景,表头行大多是描述性文本。我们设定一个阈值,当某一行的数值型元素占比超过阈值时,就判定这是数据起始行。
import pandas as pd import numpy as np def find_data_start_row(df, threshold=0.5): # 遍历每一行(Pandas索引从0开始) for idx, row in df.iterrows(): # 尝试把每行元素转成数值,统计能转成功的数量(排除空值) num_numeric = pd.to_numeric(row, errors='coerce').notna().sum() # 计算数值型元素的占比 ratio = num_numeric / len(row) # 占比超过阈值就返回Excel风格的行号(Pandas索引+1) if ratio > threshold: return idx + 1 # 如果遍历完都没找到,返回None return None # 用示例数据测试 data = { 'Col1': ['Column1', np.nan, np.nan, np.nan, 11.0, 32.0, 22.0], 'Col2': ['Column2', np.nan, 'Col2PartA', 'P', 'A', 'M', 'C'], 'Col3': ['Column3', 'Col3Part1', 'Col3Part2', 'Q', 45.0, np.nan, 67.0], 'Col4': ['Column4', np.nan, np.nan, 'R', 89.0, 90.0, np.nan] } df = pd.DataFrame(data) start_row = find_data_start_row(df) print(f"实际数据起始的Excel行号是:{start_row}") # 输出结果:实际数据起始的Excel行号是:4
方法二:通过表头关键词排除
如果你的表头行有明显的标识关键词(比如示例里的「Column」「Part」),可以直接排除包含这些关键词的行,剩下的第一行就是数据起始行。
def find_data_start_row_by_keyword(df, keywords=['Column', 'Part']): for idx, row in df.iterrows(): # 检查当前行的非空元素是否包含任何表头关键词 has_header_keyword = any( keyword in str(cell) for cell in row if pd.notna(cell) ) # 不包含关键词且不是全空行,就是数据起始行 if not has_header_keyword and row.notna().sum() > 0: return idx + 1 return None # 测试 start_row = find_data_start_row_by_keyword(df) print(f"实际数据起始的Excel行号是:{start_row}") # 输出结果:实际数据起始的Excel行号是:4
方法三:通过空值分布模式判断
表头行因为合并单元格,空值的分布通常有规律(比如某几列连续空值),而数据行的空值是随机的。我们可以通过对比空值模式来识别数据起始行。
def find_data_start_row_by_null_pattern(df): # 记录前几行的表头空值模式 header_null_patterns = [] for idx, row in df.iterrows(): # 把当前行的空值分布转成可比较的元组 current_pattern = tuple(row.isna()) # 先记录前3行的模式(如果表头行数不确定,可以调整这个数量) if idx < 3: header_null_patterns.append(current_pattern) else: # 如果当前模式和表头模式都不一样,说明是数据行 if current_pattern not in header_null_patterns: return idx + 1 return None # 测试 start_row = find_data_start_row_by_null_pattern(df) print(f"实际数据起始的Excel行号是:{start_row}") # 输出结果:实际数据起始的Excel行号是:4
小提示
这些方法都可以根据你的实际数据灵活调整:比如数值占比的阈值、表头关键词、表头行数的预设值等。如果你的数据有特殊业务规则(比如数据行的第一列一定是数字),还可以进一步优化判断逻辑哦。
备注:内容来源于stack exchange,提问作者Debojit Roy
相关产品推荐
相关产品推荐

