1

結果のデータ セットのコピーを返す、次のようなブール フィルター操作を実行します。

df[(df.age > 20) & (df.age < 30)]. 

結果のセットから、インデックスに基づいてランダムなスライスを選択したいと思います。だから例えば。10行目、14行目、17行目が欲しいかもしれません。

でも言えない

df[(df.age > 20) & (df.age < 30) & df.index.isin([10, 14, 17])] 

フィルタリングされたインデックスが異なるためです。これは、次のように 3 つのステートメントで簡単に実行できます。

a = df[(df.age > 20) & (df.age < 30)]. 
a = a.reset_index()
result = a.index.isin([10, 14, 17])

これは、潜在的にデータ セット全体 (100 万行) に対する大規模なコピー操作であり、その後のリセット操作です。

コピー操作なしでこれをワンステップで実行したいと思います。コメント/洞察をいただければ幸いです。

4

2 に答える 2

1

これに対する 1 つの改善点は、指定された整数位置ilocの行のみを取得する を使用することです。

a = df[(df.age > 20) & (df.age < 30)]
a.iloc[10, 14, 17]

注: これは、18 行がないIndexError場合にスローされます。a

ドキュメントのインデックス作成セクションを参照してください。

于 2013-02-09T00:31:21.177 に答える
0

使用するだけ.ixです:

In [1]: df = DataFrame(np.arange(20).reshape(5,4))

In [2]: df
Out[2]:
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19

ここでは、最初の列の値が 12 未満のデータ フレームにインデックスを付け.ix、結果の 0 番目と 2 番目の行を取得するために使用します。

In [3]: df[df[0] <12].ix[[0,2]]
Out[3]:
   0  1   2   3
0  0  1   2   3
2  8  9  10  11

アップデート:

わかりました、インデックスにブール値のインデックスを付けて、それをに渡すのは.ixどうですか?

In [1]: (df[0] < 12) | (df[0] > 12)
Out[1]:
0     True
1     True
2     True
3    False
4     True
Name: 0

上記のブール値シリーズを使用して df.index にインデックスを付けます。

In [2]: df.index[(df[0] < 12) | (df[0] > 12)]
Out[2]: Int64Index([0, 1, 2, 4], dtype=int64)

ここで、上記を で使用しdf.ix[]ます。ここで、3 を渡すと、最初にインデックス付けされた 4 行目が引き戻されます。

In [3]: df.ix[df.index[(df[0] < 12) | (df[0] > 12)][3]]
Out[3]:
0    16
1    17
2    18
3    19
Name: 4
于 2013-02-09T02:46:10.740 に答える