4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pandasでデータを操る。重複した行のみを残したい編

Posted at

Introduction

ここに以下のような実験データ(test.tsv)があります。

スクリーンショット 2019-03-05 9.36.17.png

このデータをよく見てみると、POS列に同じ値が入っている箇所がいくつかあることがわかりました。今後はこれに注目してデータ処理を行いたいと思ったため、POS列で重複した箇所だけを抽出するスクリプトがほしい、というのが今回のお題です。この例ではPOSの値が865545, 874671, 874826が重複しているので、その部分さえぬき出せればよいということになります。

.duplicated()

ズバリ、今回の願いを叶えるスクリプトは以下のようになります。

test.py

'''
    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')

そして結果は以下のようになります。

スクリーンショット 2019-03-05 9.51.06.png

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として残しています。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?