You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

函数逻辑说明

  1. 定位表头行:通过匹配目标列的前两个字段(name和place),找到所有表头行的位置;
  2. 截取有效数据:以第一个表头行作为新列名,截取该行之后的所有行作为数据主体;
  3. 过滤重复表头:移除后续可能出现的重复表头行(比如df1中的第二个name行);
  4. 保留指定列:只保留col_list中存在的列,自动忽略不存在的organization;
  5. 重置索引:规整结果的索引。

内容的提问来源于stack exchange,提问作者emiley mille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:15:13