您可以使用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()
然后排除 h4,h5,h6 where sourceid == 10 by:
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 是具有重复索引值的 Series,当索引值有序时,Pandas 使用 searchsorted 查找索引。它是 O(log N),比创建 O(N) 的掩码数组更快。