Python 从dataframe中删除行,直到找到实际的列名

Python 从dataframe中删除行,直到找到实际的列名,python,pandas,Python,Pandas,我正在熊猫数据框中阅读电子邮件中的表格数据。 无法保证列名将包含在第一行中。有时数据的格式如下。 将始终存在的列名有[ID、名称和年份]。有时可能会有其他列,如“年龄” 有时,列名会按预期出现在第一行中 ID Name Year 1 John Sophomore 2 Lisa Junior 3 Ed Senior 从电子邮件中读取HTML表后,如何删除不包含列名的初始行?[“ID”、“Name”、

我正在熊猫数据框中阅读电子邮件中的表格数据。 无法保证列名将包含在第一行中。有时数据的格式如下。 将始终存在的列名有[ID、名称和年份]。有时可能会有其他列,如“年龄”

有时,列名会按预期出现在第一行中

ID     Name        Year
1      John        Sophomore
2      Lisa        Junior
3      Ed          Senior
从电子邮件中读取HTML表后,如何删除不包含列名的初始行?[“ID”、“Name”、“Year”] 因此,在第一种情况下,我需要删除dataframe中的前2行(包括列行),在第二种情况下,我不需要删除任何内容

此外,列名可以是任意序列,也可以是可变的。但这3列将始终存在[“ID”、“名称”、“年份”] 如果我执行以下操作,则仅当数据帧仅包含3列[“ID”、“Name”、“Year”]

只要行包含这3列[“ID”、“Name”、“Year”]中的任何一列,我就应该能够获取相应的列索引 我怎样才能做到这一点? 我试过了


但是我得到了错误

您可以堆叠数据帧并使用
isin
查找标题行

#make sure your read method has pd.read..(headers=None)
def find_columns(dataframe,cols) -> list:
    stack_df = dataframe.stack()
    header_row = stack_df[stack_df.isin(cols)].index.get_level_values(0)[0]
    return header_row
IIUC,一个小功能可以工作。(就我个人而言,我会将此更改为传入您的文件I/O读取方法,并返回从该标题行开始的数据帧

#make sure your read method has pd.read..(headers=None)
def find_columns(dataframe,cols) -> list:
    stack_df = dataframe.stack()
    header_row = stack_df[stack_df.isin(cols)].index.get_level_values(0)[0]
    return header_row

col_index = df.index[(["ID","Name","Year"] in df).any(1)].item()
#make sure your read method has pd.read..(headers=None)
def find_columns(dataframe,cols) -> list:
    stack_df = dataframe.stack()
    header_row = stack_df[stack_df.isin(cols)].index.get_level_values(0)[0]
    return header_row
header_row = find_columns(df,["Age", "Year", "ID", "Name"])

new_df = pd.read_csv(file,skiprows=header_row)

   ID  Name       Year  Age
0   1  John  Sophomore   20
1   2  Lisa     Junior   21
2   3    Ed     Senior   22