Pythonのパッケージpandasを使って、簡単なデータ処理を行います。ここでは、適当な動物名を作るデータフレームから、「2つのカラムで共通する、実際に存在する動物」を抜き出す処理を行います。研究的には、2種類の動物で双方向にBLASTを行い、ベストヒットの結果の組み合わせを抽出するのに使えます。以前はperlでスクリプトを書いてやっていたのですが、データの行数が異なる場合など、条件によってはうまく抽出ができなかったので(これは単に私の力不足ですが)、やり方を変えてpythonで処理してみたらうまく抽出ができるようになりました。この時の練習用に作った動物のデータフレームを使って組合せの抽出を行います。
使ったタブ区切りファイル2つ(リンクからダウンロードできます)
抽出のルール
・2つのカラムに共通する=名前が2つのデータフレームの両方に存在する。
もしかするともっと良い方法があるかもしれないので、ご存知の方がいれば教えていただければ幸いです。
まず、Pythonの使い方、pandasのインストールまでは教科書的な本や、他のサイトで調べていただくとして、import以降のコマンドラインは以下の通りです。
pd.read_table('データフレーム名', header=0)
タブ区切りファイルを読み込む場合は_tableで、カンマ区切りなら_csvを使う。
デフォルトではheader=0になっている。ヘッダーが無い場合はheader=Noneを使う。
先頭行と末尾の行だけを表示する場合は
データフレーム名.head(引数) もしくは .tail(引数) を用いる
カラムを確認したい場合は、
データフレーム名.columns
ここで、AnimalsBの'animal'と'decoration'と列がAnimalsAと逆になっていますので、列を入れ替えて同名のデータフレームとします。使い方はこんな感じです
新しいデータフレーム名 = データフレーム名[['カラム名1', 'カラム名2', . . . ]]
.head(3)でデータフレームのチェック。
次に、データフレームの連結を行います。
新しいデータフレーム名 = pd.concat([データフレーム1, データフレーム2])
pd.concatはaxis=でデータフレームを連結する方向を変えられます。
(デフォルトはaxis=0で縦方向に連結、axis=1で横方向に連結できます)
この際、連結方向のカラム数もしくは行数が合っている必要があります。
どうやら連結ができたようなので、名前が2つのデータフレームの両方にある種類の抽出を行います。
データフレーム名[データフレーム名.duplicated()]
を使います
余計なアンダースコアが入ってしまい、エラーが出てしまいました。
やり直してみると、2行のみが出てきました。これは、.duplicated()で()内に特に指定がなければ全てのカラムが一致した時だけ抽出されるためです。オオカミとアカオオカミで全てのカラムが一致する行が重複していたようです。今度は、.duplicated(subset=['カラム名', 'カラム名'])を使って重複を探すカラムを指定してみましょう。しかし、今度はring sharkとblue deerが残っていますね。これは、データフレームAnimalsA、AnimalsBだけで複数回出てくるringとsharkの組み合わせ、blueとdeerの組み合わせが残っているためで、ルールにある2つのデータフレームの両方に存在するという条件を満たすために、各データフレームの中で重複している種類を先に削らなければいけません。
重複行の削除にはdrop_duplicates()を使います
duplicated()の時と同じように、subset =[]を使って重複を削るカラムを指定します。
2つ目のring sharkが消えましたね。
同様に、AnimalsBにあるblue deerの重複を削りましょう。
下の結果(dropした方)では、blue deerが1つになっていることがわかります。
重複を削ったデータフレームを新たにつなげて、もう一度重複行の抽出を行うと、、
10種類になりました。どれも実在する動物ですね(wikipediaのリンクを貼っておきます)
red wolf:アメリカアカオオカミ、もしくはドールの別名
実在していても、片方のデータフレームにしか名前がなかったので、リストから弾かれてしまった動物もいます(black cod:ギンダラ など)。
次回は、新しく作ったこのデータフレームを用いて、
特定の列の抽出
特定の行の抽出
カラムの統合
ファイルへの書き出し
を行おうと思います。
0コメント