【问题标题】:Skip rows stated with "#" using pandas使用 pandas 跳过带有“#”的行
【发布时间】:2021-01-20 09:00:09
【问题描述】:

我有一个像这样的大型数据集:

##fileformat=VCFv4.2
##fileDate=20201231
##source=PLINKv1.90
##contig=<ID=1,length=188260454>
##contig=<ID=10,length=85155382>
##contig=<ID=11,length=61676533>
##contig=<ID=12,length=36989714>
##contig=<ID=13,length=43784426>
##contig=<ID=14,length=94600040>
##contig=<ID=15,length=92851205>
##contig=<ID=16,length=88959756>
##contig=<ID=17,length=80722365>
##contig=<ID=18,length=82634671>
##contig=<ID=19,length=62678559>
##contig=<ID=2,length=121349915>
##contig=<ID=20,length=65336538>
##contig=<ID=3,length=121351672>
##contig=<ID=4,length=109462228>
##contig=<ID=5,length=96758658>
##contig=<ID=6,length=87227659>
##contig=<ID=7,length=100781181>
##contig=<ID=8,length=97562725>
##contig=<ID=9,length=85788908>
##contig=<ID=21,length=58983846>
##contig=<ID=22,length=50925167>
##contig=<ID=23,length=55555792>
##contig=<ID=24,length=48279991>
##contig=<ID=25,length=40282582>
##contig=<ID=26,length=43147527>
##contig=<ID=27,length=40254630>
##contig=<ID=28,length=47348126>
##contig=<ID=29,length=34775913>
##contig=<ID=30,length=31395421>
##contig=<ID=31,length=26000291>
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  A1  A2  A3  A4
1   235 1   A   C   .   .   PR  GT  1|1 1|1 0|0 0|1
1   1000    2   G   C   .   .   PR  GT  1|1 0|1 0|1 1|1
1   1256    3   T   G   .   .   PR  GT  1|1 1|1 0|1 1|1
1   5000    4   T   A   .   .   PR  GT  0|1 0|0 0|1 1|1
1   6234    5   A   T   .   .   PR  GT  0|1 1|1 1|0 0|1
1   77453   6   A   C   .   .   PR  GT  1|0 1|0 1|0 1|0
1   84004   7   C   G   .   .   PR  GT  0|1 1|0 0|1 0|0
1   123658  8   A   T   .   .   PR  GT  1|1 0|0 1|1 0|0
1   432567  9   T   A   .   .   PR  GT  0|1 1|1 0|0 0|0
1   567432  10  A   G   .   .   PR  GT  0|0 1|1 0|1 1|1
1   1234542 11  C   A   .   .   PR  GT  0|1 0|0 0|0 0|0

要读取这个数据帧,我必须使用这个命令:

snp = pd.read_csv("Imputed.vcf",delimiter=r"\s+",header=0,skiprows=35)

实际上,我想跳过带有标签的行(行包含“#”),而不计算这些行。这种情况有什么办法吗?

【问题讨论】:

  • 您可以在导入后从数据框中过滤掉它们。发布您的数据框示例
  • 这里,我附上一个例子。正如我提到的,这个数据框是一个例子,真实的数据框太大了。因此,由于我的数据框很大,我认为导入后过滤不是一种合适的方式。
  • @jesrael 下面给了你一个完美的答案
  • 看起来旧版本中存在错误? stackoverflow.com/questions/18366797/…
  • 还有python - Read csv with pandas with commented header - Stack Overflow,在这种情况下可能有用(标题用单个#注释掉)

标签: python pandas python-2.7


【解决方案1】:

如果需要删除以# 开头的所有行,请使用comment='#'

snp = pd.read_csv("Imputed.vcf", sep=r"\s+",comment='#', header=None)

如果需要 2 个或更多字符的注释,现在不支持。

可能的想法是预处理:

import csv

#preprocessing
def get_row():
    skipped = []
    with open('Imputed.vcf', 'r') as csvfile:
        reader = csv.reader(csvfile)
        for i, row in enumerate(reader):
            if row[0].strip()[:2] == '##':
                skipped.append(i)
    return skipped 
                

skip = get_row()
print (skip)

snp = pd.read_csv("Imputed.vcf", sep=r"\s+",skiprows=skip) 

【讨论】:

  • 有没有办法跳过包含两个#的行?
  • @Siavash - 比较复杂,因为默认情况下,pandas 只转义长度为 1 的字符串,需要更多时间来解决。
  • @Siavash - 不幸的是没那么容易,我添加了使用## 获取行索引的解决方案并传递给skiprows 参数。
  • @jesrael 是的,我正在尝试使用 dask 或 chunk 来阅读它。谢谢!
  • @jesrael 在 Github 有人提到过这个问题:github.com/pandas-dev/pandas/issues/21725
猜你喜欢
  • 1970-01-01
  • 2018-11-17
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多