Introduction
ここに以下のような実験データ(test.tsv)があります。
このデータをよく見てみると、POS列に同じ値が入っている箇所がいくつかあることがわかりました。今後はこれに注目してデータ処理を行いたいと思ったため、POS列で重複した箇所だけを抽出するスクリプトがほしい、というのが今回のお題です。この例ではPOSの値が865545, 874671, 874826が重複しているので、その部分さえぬき出せればよいということになります。
.duplicated()
ズバリ、今回の願いを叶えるスクリプトは以下のようになります。
'''
test.py
'''
import pandas as pd
# read data
data = pd.read_csv('test.tsv', delimiter='\t', index_col=0)
# delete non-overlapping row
data2 = data[data.duplicated(subset='POS', keep=False)]
# write to excel
data2.to_excel('test.xlsx')
そして結果は以下のようになります。
subset 引数
.duplicated()の引数subsetに重複を判定したい列名を指定しています。試しに以下のコマンドを実行してみましょう。
print(data.duplicated(subset='POS', keep=False))
結果は以下のようになります。
# CHROM
chr1 False
chr1 False
chr1 True
chr1 True
chr1 False
chr1 False
chr1 False
chr1 True
chr1 True
chr1 False
chr1 False
chr1 False
chr1 False
chr1 True
chr1 True
dtype: bool
POS列で重複している行全てがTrue, それ以外がFalseとなっていることがわかります。もし、POS列だけでなくREF列の重複も判定したい場合は
data2 = data[data.duplicated(subset=['POS', 'REF'], keep=False)]
のようにsubsetに列名のリストを渡してあげます。
keep引数
では.duplicated()のもう一つの引数であるkeepはどのように使うのでしょうか。
今度は試しに
print(data.duplicated(subset='POS', keep='first'))
としてみます。すると結果は
# CHROM
chr1 False
chr1 False
chr1 False
chr1 True
chr1 False
chr1 False
chr1 False
chr1 False
chr1 True
chr1 False
chr1 False
chr1 False
chr1 False
chr1 False
chr1 True
dtype: bool
となります。keep='first'とすると、重複した行の中でも最初に見つけた行がFalseとなります。keep='last'とすれば、逆に重複した行の中でも最後に見つけた行がFalseとなり、
# CHROM
chr1 False
chr1 False
chr1 True
chr1 False
chr1 False
chr1 False
chr1 False
chr1 True
chr1 False
chr1 False
chr1 False
chr1 False
chr1 False
chr1 True
chr1 False
dtype: bool
となります。今回の場合、keep=Falseを指定することで、重複した行全てをTrueとして残しています。