Python 从dataframe中删除行,直到找到实际的列名
我正在熊猫数据框中阅读电子邮件中的表格数据。 无法保证列名将包含在第一行中。有时数据采用以下格式。实际列名为[ID、名称和年份]Python 从dataframe中删除行,直到找到实际的列名,python,pandas,Python,Pandas,我正在熊猫数据框中阅读电子邮件中的表格数据。 无法保证列名将包含在第一行中。有时数据采用以下格式。实际列名为[ID、名称和年份] dummy1 dummy2 dummy3 test_column1 test_column2 test_column3 ID Name Year 1 John Sophomore 2 Lisa Junior 3 Ed Senior 有时,列名
dummy1 dummy2 dummy3
test_column1 test_column2 test_column3
ID Name Year
1 John Sophomore
2 Lisa Junior
3 Ed Senior
有时,列名会按预期出现在第一行中
ID Name Year
1 John Sophomore
2 Lisa Junior
3 Ed Senior
一旦我从电子邮件中读取HTML表,我将如何删除不包含列名的初始行?因此,在第一种情况下,我需要删除数据框中的前2行(包括列行),在第二种情况下,我不必删除任何内容
此外,列名可以是任意序列。
基本上,我想做以下几点
1.check whether once of the column names contains in one of the rows in dataframe
2.Remove the rows above
if "ID" in row:
remove the above rows
我如何才能做到这一点?丑陋但有效的快速尝试:
id_name = df.columns[0]
df_clean = df[(df[id_name] == 'ID') | (df[id_name].dtype == 'int64')]
丑陋但有效的快速尝试:
id_name = df.columns[0]
df_clean = df[(df[id_name] == 'ID') | (df[id_name].dtype == 'int64')]
您可以首先获取有效列的
索引
,然后进行相应的筛选和设置
df = pd.read_csv("d.csv",sep='\s+', header=None)
或
如果您想将ID
作为索引
df = df.iloc[col_index + 1 :].set_index('ID')
df
Name Year
ID
1 John Sophomore
2 Lisa Junior
3 Ed Senior
您可以首先获取有效列的
索引
,然后进行相应的筛选和设置
df = pd.read_csv("d.csv",sep='\s+', header=None)
或
如果您想将ID
作为索引
df = df.iloc[col_index + 1 :].set_index('ID')
df
Name Year
ID
1 John Sophomore
2 Lisa Junior
3 Ed Senior
原始数据的格式是什么?是HTML吗?纯文本?HTML..我正在读取找到标记的表格。我正在读取列表中的表格,我的代码结构与列表中的df类似:#检查df中哪一行包含列名#删除上面的行#执行其他处理#读取#html接受允许跳过行的头参数。最好先确定行数,然后再读取HTML。你能提供样本数据吗?我可以试着写一个解决方案。原始数据的格式是什么?是HTML吗?纯文本?HTML..我正在读取找到标记的表格。我正在读取列表中的表格,我的代码结构与列表中的df类似:#检查df中哪一行包含列名#删除上面的行#执行其他处理#读取#html接受允许跳过行的头参数。最好先确定行数,然后再读取HTML。你能提供示例数据吗?我可以试着写一个解决方案。谢谢,但它给了我以下错误col_index=df.index[(df=[“ID”,“Name”,“Year”])。all(1)]。item()#get columns index ValueError:无效的广播比较[ID”,“Name”,“Year”]关于块值,我猜可能是您使用的是旧版本的pandas。我在pandas 1.x中尝试过,它正在工作。不管怎么说,您使用的是哪个版本?我使用的是0.25.3,这不是版本问题。我在
0.25.3
中尝试过,它也在那里工作。谢谢..只需再查询一次..数据帧中的列数可以是可变的,但是[“ID”,“Name”,“Name.”年份“]将始终存在..我想查找这3列中的任何一列..在这种情况下,我如何修改上述代码?我三次使用此df.index[(df=[“ID”,“Name”,“Year”]).any(1)].item()
但它是错误的..我还尝试了df.index[(“ID”in df)].item()
。但它是错误的谢谢,但它给了我以下错误col\u index=df.index[(df==[“ID”,“Name”,“Year”])。所有(1)]。项()#获取列索引值错误:无效的广播比较[ID”,“Name”,“Year”]使用块值,我猜可能是您使用的是旧版本的pandas。我在pandas 1.x中尝试过,它正在工作。不管怎样,您使用的是哪个版本?我使用的是0.25.3,这不是版本问题。我在0.25.3
中尝试过,它也在那里工作。谢谢..只需再查询一次..数据帧中的列数可以是可变的,但是[“ID”,“Name”,“年”]将始终存在..我想查找这3列中的任何一列..在这种情况下,我如何修改上面的代码?我三次使用此df.index[(df=[“ID”,“Name”,“Year”]).any(1)].item()
但它是错误的..我还尝试了df.index[(“ID”in df)].item()
。但它是错误的