【问题标题】:Delete rows containing particular pattern [Python/Pandas]删除包含特定模式的行 [Python/Pandas]
【发布时间】:2014-10-29 21:29:59
【问题描述】:

我是 Python 和 Pandas 的新手,我花了很多时间搜索,但找不到特定问题的答案。

我有一个数据框,其中前几行只是以“#”开头的 cmets,然后是包含行和列的常用数据框。我有数百个这样的文本文件需要阅读和操作。例如:

'#'blah1

'#'blah2

'#'blah3

列 1 列 2 列 3

a1 b1 c1

a2 b2 c2

等等

我想删除所有以“#”开头的行。有人可以告诉我如何在 Pandas 中执行此操作吗?

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

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

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

【问题讨论】:

  • 我认为这可能是一个错误,我尝试使用 comment="'" (因为您的行以它开头?)...read_csv docs 的评论似乎很清楚这应该有效。
  • 尚未合并:github.com/pydata/pandas/pull/7470(可以在我认为在 master 中修复的行开头的注释)
  • 你用的是什么版本的熊猫?通常这应该在 0.14.1 中工作(杰夫,我们拆分了那个 PR,评论部分已经在 0.14.1 中)。在文档字符串之后,header kwarg 应该忽略完全注释的行。
  • @joris 上面提到的 0.14.1,文档说:“如果在一行的开头找到,该行将被完全忽略。”和“此外,参数标题会忽略完全注释的行”。
  • 所以按照文档,以上应该是可能的,不是吗?提高什么?使用 0.14.1 这对我有用:df = pd.read_csv(StringIO(s), sep=' ', comment="'")

标签: python pandas


【解决方案1】:

更新到 pandas 0.14.1 或更高版本可让您正确跳过注释行。

旧版本会将行保留为 NaN,可以使用 .dropna() 删除,但会留下损坏的标题。

对于旧版本的 pandas,假设您知道注释了多少行,您可以使用“skiprows”。

在[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' 参数会处理它。
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2022-11-17
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多