如何在Python中基于已有DataFrame创建合规的目标DataFrame?
处理带重复表头的DataFrame提取指定列
需求说明
给定两个存在重复表头行的DataFrame(df1、df2),以及指定列列表 col_list = ['name','place','organization'],需要完成以下操作:
- 提取
col_list中存在的列(保留name、place,忽略不存在的organization) - 从正确的表头行开始取值
- 移除DataFrame中的重复表头行
原始数据与目标结果
df1原始结构
|findings|jinkings|org| |hij|NaN|| |name|place|org1| |A1|M1|fgi| |A2|M2|yhi| |A3|M3|vfh| |name|place|kij| |A4|M4|lik|
df1目标结果
|name|place| |A1|M1| |A2|M2| |A3|M3| |A4|M4|
df2原始结构
|hij|NaN|| |name|place|org1| |A1|M1|fgi| |A2|M2|yhi| |A3|M3|vfh| |A4|M4|lik|
df2目标结果
|name|place| |A1|M1| |A2|M2| |A3|M3| |A4|M4|
解决方案
我们可以编写一个通用函数来处理这类带重复表头的DataFrame,步骤如下:
通用处理函数
import pandas as pd def clean_target_df(raw_df, target_cols): # 定位所有包含目标表头的行(匹配前两个核心列名) header_indices = raw_df[(raw_df.iloc[:, 0] == target_cols[0]) & (raw_df.iloc[:, 1] == target_cols[1])].index # 取第一个表头行作为新列名,截取其后的所有行作为初始数据 new_columns = raw_df.loc[header_indices[0]].values cleaned_df = raw_df.loc[header_indices[0] + 1:] # 设置新列名 cleaned_df.columns = new_columns # 过滤掉后续重复的表头行 cleaned_df = cleaned_df[~(cleaned_df.iloc[:, 0] == target_cols[0])] # 只保留目标列中存在的字段 cleaned_df = cleaned_df[[col for col in target_cols if col in cleaned_df.columns]] # 重置索引 cleaned_df = cleaned_df.reset_index(drop=True) return cleaned_df
处理df1
# 构造df1 df1_data = [ ['findings', 'jinkings', 'org'], ['hij', pd.NA, ''], ['name', 'place', 'org1'], ['A1', 'M1', 'fgi'], ['A2', 'M2', 'yhi'], ['A3', 'M3', 'vfh'], ['name', 'place', 'kij'], ['A4', 'M4', 'lik'] ] df1 = pd.DataFrame(df1_data) # 处理得到结果 df1_final = clean_target_df(df1, ['name','place','organization']) print(df1_final)
处理df2
# 构造df2 df2_data = [ ['hij', pd.NA, ''], ['name', 'place', 'org1'], ['A1', 'M1', 'fgi'], ['A2', 'M2', 'yhi'], ['A3', 'M3', 'vfh'], ['A4', 'M4', 'lik'] ] df2 = pd.DataFrame(df2_data) # 处理得到结果 df2_final = clean_target_df(df2, ['name','place','organization']) print(df2_final)
函数逻辑说明
- 定位表头行:通过匹配目标列的前两个字段(
name和place),找到所有表头行的位置; - 截取有效数据:以第一个表头行作为新列名,截取该行之后的所有行作为数据主体;
- 过滤重复表头:移除后续可能出现的重复表头行(比如df1中的第二个
name行); - 保留指定列:只保留
col_list中存在的列,自动忽略不存在的organization; - 重置索引:规整结果的索引。
内容的提问来源于stack exchange,提问作者emiley mille
相关产品推荐
相关产品推荐

