4

Pandas を使い始めたばかりで、それが私の問題に適したツールであるかどうかを判断しようとしています。

私はデータセットを持っています:

date, sourceid, destid, h1..h12

基本的に、H1..H12 列のそれぞれの合計に関心がありますが、データセットから複数の範囲を除外する必要があります。

例は次のとおりです。

sourceid = 4944 の H4、H5、H6 データを除外し、destination = 481981 の H8、H9-H12 を除外し、...

...これは、最終モデルに近づけるためにデータを常に削除しているため、多くのフィルターで継続できます。

ソリューションで、必要なフィルターのリストを作成してからテストする関数を作成できることを見たと思いますが、うまくいく良い例が見つかりませんでした。

私の最初の考えは、df のコピーを作成し、不要なデータを削除することでした。必要な場合は元の df からコピーして戻すことができましたが、それは間違った道のようです。

4

2 に答える 2

5

マスクを使用すると、データフレームからデータを削除する必要がありません。例えば:

mask1 = df.sourceid == 4944
var1 = df[mask1]['H4','H5','H6'].sum()

または直接行う:

var1 = df[df.sourceid == 4944]['H4','H5','H6'].sum()

複数のフィルターの場合、ブールマスクをブール演算子と組み合わせることができます。

totmask = mask1 & mask2
于 2013-02-14T08:19:54.073 に答える
1

を使用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)であるマスク配列を作成するよりも高速です。

于 2013-02-15T03:53:16.580 に答える