删除包含特定模式的行 [Python/Pandas]

4

我是Python和Pandas的新手,花了很多时间搜索但没有找到解决我的问题的答案。

我有一个数据框,其中前几行只是以'#'开头的注释,接着是包含行和列的通常数据框。我有数百个这样的文本文件需要读取和操作。例如:

'#' blah1

'#' blah2

'#' blah3

Column1 Column2 Column3

a1 b1 c1

a2 b2 c2

等等。

我想删除所有以'#'开头的行。有人能告诉我如何在Pandas中实现这一点吗?

或者,我尝试使用以下代码来读取文本文件:

my_input=pd.read_table(filename, comment='#', header=80)

但问题在于每个文本文件的标题行都不同。有没有一种方法可以概括并告诉Python我的标题在以“#”开头的最后一行下方?


1
我认为这可能是一个错误,我尝试使用comment="'"(因为你的行以此开头?)... read_csv文档中关于comment的说明非常清楚,应该可以工作。 - Andy Hayden
1
还没有合并:https://github.com/pydata/pandas/pull/7470(开头的注释是否已在主分支中修复) - Jeff
1
你使用的pandas版本是什么?通常在0.14.1中应该可以工作(Jeff,我们拆分了那个PR,注释部分已经在0.14.1中)。根据文档字符串,'header'关键字参数应该忽略完全注释的行。 - joris
@joris 在0.14.1版本中,文档中提到:“如果在行首找到该符号,则整行将被忽略。”和“此外,参数头部分也会忽略完全注释的行。” - Andy Hayden
所以根据文档,以上应该是可能的,不是吗?raise是什么意思?在0.14.1版本中,这对我有效:df = pd.read_csv(StringIO(s), sep=' ', comment="'") - joris
显示剩余2条评论
1个回答

3

更新至pandas 0.14.1或更高版本可以正确地跳过被注释的行。

旧版会将这些行保留为NaN,可以使用.dropna()删除,但会留下破损的表头。

对于旧版pandas,可以使用'skiprows',假设您知道有多少行已被注释。

In[3]:

s = "# blah1\n# blah2\n# blah3\nCol1 Col2 Col3\na1 b1 c1\na2 b2 c2\n"
pd.read_table(StringIO(s), skiprows=3, sep=' ')

输出[3]:

Col1    Col2    Col3
0   a1  b1  c1
1   a2  b2  c2

如果只有一个或两个文件,我可以使用“skiprows”来跳过行数。但问题在于我有300个文件需要从中提取数据,并且每个文件都需要跳过不同数量的行。但无论如何,就像您正确指出的那样,问题出在Anaconda安装的Pandas版本上。在更新的版本中,“comment”参数可以解决这个问题。 - AHegde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接