を使用DataFrame.ix[]
して、データをゼロに設定できます。
最初にダミーの DataFrame を作成します。
N = 10000
df = pd.DataFrame(np.random.rand(N, 12), columns=["h%d" % i for i in range(1, 13)], index=["row%d" % i for i in range(1, N+1)])
df["sourceid"] = np.random.randint(0, 50, N)
df["destid"] = np.random.randint(0, 50, N)
次に、フィルターごとに次を呼び出すことができます。
df.ix[df.sourceid == 10, "h4":"h6"] = 0
600k行あるので、マスク配列を作成するのがdf.sourceid == 10
遅いかもしれません。値を DataFrame のインデックスにマップする Series オブジェクトを作成できます。
sourceid = pd.Series(df.index.values, index=df["sourceid"].values).sort_index()
destid = pd.Series(df.index.values, index=df["destid"].values).sort_index()
次に、sourceid == 10 の h4、h5、h6 を次のように除外します。
df.ix[sourceid[10], "h4":"h6"] = 0
sourceid == 10 および destid == 20 の行 ID を検索するには:
np.intersect1d(sourceid[10].values, destid[20].values, assume_unique=True)
10 <= sourceid <= 12 および 3 <= destid <= 5 の行 ID を検索するには:
np.intersect1d(sourceid.ix[10:12].values, destid.ix[3:5].values, assume_unique=True)
sourceid と destid は、インデックス値が重複しているシリーズです。インデックス値が正しい場合、Pandas は searchsorted を使用してインデックスを見つけます。それはO(log N)であり、O(N)であるマスク配列を作成するよりも高速です。