

vcfファイルには最初の何行にも渡って#で書かれた箇所があり、読み込んだ時に#も一緒に出力してしまいます。その結果、counterでは`{('3':987,
'7':654, ・・・'#~~':1, '#~~':1)}`といった感じに＃のものまでカウントされてしまいます。この＃を消す方法はあるのでしょうか？

また、カウントの順番を多い順ではなく、1,2,3と番号順にすることはできるのでしょうか？

[code]

    import sys
    import os
    from collections import Counter
    
    count = []
    with open('test.vcf','r') as file:
        lines = file.read().split('\n')
    
        for line in lines:
            a = line.split('\t')
            CHR = a[0]
            count.append(CHR)
    
    c = Counter(count)
    print(c)
    
[/code]


CC BY-SA 4.0
2019-05-15T08:33:45.453
54973
2020-10-01T12:03:15.030
2020-10-01T12:03:15.030
32986
34322
question
python python3 bioinformatics
#(コメントアウト)を削除したい


[先の回答](https://ja.stackoverflow.com/a/54971/29826)で記載したとおり[Counter](https://docs.python.org/ja/3/library/collections.html#collections.Counter)クラスは辞書型のサブクラスであるため、これを利用して実装可能です。

具体的には、[dict.keys()](https://docs.python.org/ja/3/library/stdtypes.html#dict.keys)でキーを一覧し、それから[del](https://docs.python.org/ja/3/reference/simple_stmts.html#the-
del-statement)を行うことで可能でしょう。

また、辞書は順序の概念がないためソートは不可能ですが、これもキーを任意の順序にソートしてアクセスすることで対応可能です。

[code]

    c_keys = c.keys().sort()
    
    for k in c_keys:
        if k[0] == '#':
            del c[k]
        else:
            print(k, c[k])
    
[/code]


CC BY-SA 4.0
2019-05-15T08:54:49.953
54975
2019-05-15T08:54:49.953
29826
54973
answer


こんな感じで、基本のライブラリと `pandas` を使って実現できるでしょう。

[code]

    import sys
    import os
    import pandas as pd
    
    # ファイル読み取り＆コメント削除(有効なデータの中に'#'は無いものと仮定)
    lines = []
    with open('test.vcf','r') as file:
        alltext = file.readlines()
        for line in alltext:
            str = line.strip().split('#')  # 行の前後の空白を削除し、'#'で分割
            if str[0]:                     # コメントでは無い部分だけリスト化
                lines.append(str[0])
    
    # 各行のタブで区切った最初のデータをリスト化
    count = []
    for line in lines:
        a = line.split('\t')
        count.append(a[0])
    
    # データの出現回数をカウントしてDataFrame化
    s = pd.Series(count)
    vc = pd.value_counts(s)
    df = vc.rename_axis('CHR').to_frame('counts')
    
    # データ文字列の最大長を取得
    idx = list(df.index)
    n = len(max(idx, key=len))
    
    # 数値データを抽出し、右寄せしてソート
    dfnum = df.query('CHR.str.isnumeric()', engine='python')
    dfnum = dfnum.rename(index=lambda s: s.rjust(n))
    dfnum = dfnum.sort_index()
    
    # 文字列データを抽出し、右寄せしてソート
    dfstr = df.query('not CHR.str.isnumeric()', engine='python')
    dfstr = dfstr.rename(index=lambda s: s.rjust(n))
    dfstr = dfstr.sort_index()
    
    # 数値・文字列のDataFrameを連結
    dfall = pd.concat([dfnum, dfstr])
    
    # 結果表示
    print(dfall)
    
[/code]

* * *

検索したら、.vcf ファイル等を扱うライブラリがあるようですので、そちらを使うのもアリかもしれません。

[cyvcf2](https://pypi.org/project/cyvcf2/) /
[pysam](https://pypi.org/project/pysam/) /
[PyVCF](https://pypi.org/project/PyVCF/)  
[cyvcf2: fast, flexible variant analysis with
Python](https://academic.oup.com/bioinformatics/article/33/12/1867/2971439)

他に古そうですがこんなまとめページも。  
[Python の基礎とバイオインフォマティクス Python 3.4](https://bi.biopapyrus.jp/python/)

* * *

直接は関係無いですが、専門分野向けパッケージ等も。

[Bioconda](http://bioconda.github.io/)  
[biocondaを利用してNGS関連のソフトウェアを一括でインストールする](http://imamachi-n.hatenablog.com/entry/2017/01/14/212719)  
[Biocondaを使ってみた](https://bonohu.wordpress.com/2017/07/08/bioconda/)

[Python for Biologists](https://pythonforbiologists.com/)

[Biopython](https://biopython.org/)


CC BY-SA 4.0
2019-05-15T18:01:06.843
54986
2019-05-15T23:22:13.003
2019-05-15T23:22:13.003
26370
26370
54973
answer