python pandas「データの参照方法〜whereの使い方」

スポンサーリンク

バイオインフォマティクスでは、数百〜数万の遺伝子やサンプルに関するデータを効率よく操作・解析することが求められます。Pythonのpandasライブラリは、そのような大量データを扱う上で非常に強力なツールです。

今回は、pandasを使った「データの参照方法」と、少し発展的な「DataFrameのwhereメソッド」について、基本と応用を交えて解説します。遺伝子発現データやサンプル情報を扱うシーンを想定した例も紹介していきます。


1. pandasの基本構造:DataFrameとは?

pandasでは、データの基本的な構造として以下の2つがあります:

  • Series:1列のデータ(ラベル付き配列)
  • DataFrame:複数列からなる表形式のデータ(行と列のラベルを持つ)

特にDataFrameは、行(例:サンプル)×列(例:遺伝子)のようなバイオデータにぴったりです。

import pandas as pd

# 遺伝子発現の例
data = {
    "Gene": ["BRCA1", "TP53", "EGFR"],
    "Sample1": [2.5, 8.1, 5.3],
    "Sample2": [3.2, 7.9, 6.5]
}

df = pd.DataFrame(data)
print(df)

出力は以下のようになります:

    Gene  Sample1  Sample2
0  BRCA1      2.5      3.2
1   TP53      8.1      7.9
2   EGFR      5.3      6.5

2. データの参照方法(基本編)

pandasの魅力の一つは、データを柔軟に参照・抽出できることです。以下に主な方法を紹介します。

2.1 ラベル指定で参照:loc[]

行・列名でデータを参照できます。

# 行のラベルが1、列が"Sample1"
df.loc[1, "Sample1"]  # 出力: 8.1

2.2 インデックス指定で参照:iloc[]

数値で指定する方法です。

# 行2列1(0始まり)
df.iloc[2, 1]  # 出力: 5.3

2.3 複数条件の参照

例えば、”Sample1″の値が5.0以上の行を抽出したい場合:

df[df["Sample1"] >= 5.0]

出力:

    Gene  Sample1  Sample2
1   TP53      8.1      7.9
2   EGFR      5.3      6.5

3. whereメソッドとは?(基本)

次に、条件に合った値だけを残し、それ以外を欠損値(NaN)にする方法として、whereメソッドがあります。

df["Sample1"].where(df["Sample1"] > 5.0)

出力:

0    NaN
1    8.1
2    5.3
Name: Sample1, dtype: float64

このように、条件に合致しない値がNaNになるのがwhereの特徴です。

3.1 DataFrame全体に適用する例

df.set_index('Gene', inplace=True)
df.where(df > 5.0)

出力:

	Sample1	Sample2
Gene		
BRCA1	NaN	NaN
TP53	8.1	7.9
EGFR	5.3	6.5

文字列列「Gene」は比較不能なため、数値部分だけに適用しました。


4. whereの応用編:マスク処理や条件代入

4.1 条件付きの代入処理

条件に合致する箇所を置き換えたいときにも使えます。

# Sample1が5未満なら0に置き換え
df["Sample1"] = df["Sample1"].where(df["Sample1"] >= 5.0, other=0)

出力:

    Gene  Sample1  Sample2
0  BRCA1      0.0      3.2
1   TP53      8.1      7.9
2   EGFR      5.3      6.5

4.2 マルチ条件の適用

複数の条件に基づいて処理をしたい場合も、whereは便利です。

# Sample1が5以上 かつ Sample2が6以上の行を残す
condition = (df["Sample1"] >= 5.0) & (df["Sample2"] >= 6.0)
filtered = df.where(condition)

5. 実践:バイオデータにおけるwhereの使い道

5.1 発現閾値を超えた遺伝子だけ表示

df = pd.DataFrame({
    "Gene": ["BRCA1", "TP53", "EGFR", "MYC"],
    "Sample1": [2.5, 8.1, 5.3, 1.2],
    "Sample2": [3.2, 7.9, 6.5, 2.8]
})

# Sample1が4以上の遺伝子だけを残す(それ以外はNaN)
df.set_index("Gene", inplace=True)
result = df.where(df["Sample1"] >= 4.0)

出力:

       Sample1  Sample2
Gene                    
BRCA1      NaN      NaN
TP53       8.1      7.9
EGFR       5.3      6.5
MYC        NaN      NaN

5.2 欠損値の扱いと併用

NaNになった部分をfillna()で補完するのも一般的です。

result.fillna(0)

6. まとめ:whereを使いこなすポイント

機能説明
where(cond)条件に一致する値を残し、それ以外をNaNに
where(cond, other=X)条件に一致しない値をXに置き換える
fillna()NaNを特定の値で補完
mask(cond)whereの逆:条件に一致する部分をNaNに

おわりに

pandasのwhereメソッドは、条件に基づいた柔軟なデータ処理に非常に便利です。特にバイオインフォマティクスにおいては、遺伝子の発現値があるしきい値を超えているかどうか、異常値をフィルタリングするなどの処理が頻繁に登場します。

今回ご紹介した基本的な参照方法とwhereの活用法を理解することで、今後のデータ解析における表現力が大きく広がることでしょう。

今後は、query()mask()、あるいはapply()関数と組み合わせた高度な処理についても取り上げていきたいと思います!!pandasの力を使って、よりスマートに、より再現性高く、解析を進めていきましょう〜!


タイトルとURLをコピーしました