web-dev-qa-db-ja.com

Pandas Rと同等のwhich()

この質問のバリエーションは以前に尋ねられましたが、設定したい条件に基づいてpython series/pandasデータフレームを実際にスライスする方法を理解するのにまだ問題があります。

Rで、私がやろうとしていることは次のとおりです。

df[which(df[,colnumber] > somenumberIchoose),]

Which()関数は、データフレーム内の列のsomenumberIchooseより大きい行エントリのインデックスを検索し、これをベクトルとして返します。次に、これらの行インデックスを使用してデータフレームをスライスし、データフレームのどの行を新しい形式で表示するかを示します。

Pythonでこれを行う同等の方法はありますか?列挙するための参照を見たことがありますが、ドキュメントを読んだ後は完全には理解できません。行インデックスを取得するための私のサンプルは、次のようになります。

indexfuture = [ x.index(), x in enumerate(df['colname']) if x > yesterday]  

ただし、無効な構文エラーが発生し続けます。値をループし、自分で手動で検索を実行することで回避策をハックできますが、それは非常に非Python的で非効率的です。

Enumerate()は正確に何をしますか?目的のパラメーターを満たすベクトル内の値のインデックスを見つけるPythonの方法は何ですか?

注:データフレームにはPandas

15
user2643394

質問がはっきりとわからないかもしれませんが、回答はあなたが思っているよりも簡単なようです。

pandas DataFrame:

df['colname'] > somenumberIchoose

true/False値とDataFrameの元のインデックスを持つpandasシリーズを返します。

次に、元のDataFrameでそのブール系列を使用して、探しているサブセットを取得できます。

df[df['colname'] > somenumberIchoose]

十分なはずです。

http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing を参照してください。

12
fdeheeger

私がRについて知っていることは、MATLABに似た科学計算パッケージで numpy -を使用する方が快適かもしれません。

値が2で割り切れる配列のインデックスが必要な場合は、次のように機能します。

arr = numpy.arange(10)
truth_table = arr % 2 == 0
indices = numpy.where(truth_table)
values = arr[indices]

多次元配列の操作も簡単です

arr2d = arr.reshape(2,5)
col_indices = numpy.where(arr2d[col_index] % 2 == 0)
col_values = arr2d[col_index, col_indices]
5
Dunes

enumerate()は、各反復で_(index, item)_タプルを生成するイテレーターを返すため、.index()を再度呼び出すことはできません(また、呼び出す必要はありません)。

さらに、リスト内包表記の構文が間違っています。

_indexfuture = [(index, x) for (index, x) in enumerate(df['colname']) if x > yesterday]
_

テストケース:

_>>> [(index, x) for (index, x) in enumerate("abcdef") if x > "c"]
[(3, 'd'), (4, 'e'), (5, 'f')]
_

もちろん、タプルを解凍する必要はありません。

_>>> [tup for tup in enumerate("abcdef") if tup[1] > "c"]
[(3, 'd'), (4, 'e'), (5, 'f')]
_

インデックスのみに関心がある場合を除いて、その場合は次のようなことができます。

_>>> [index for (index, x) in enumerate("abcdef") if x > "c"]
[3, 4, 5]
_
2
Tim Pietzcker

これを行うための素晴らしくシンプルできちんとした方法は次のとおりです。

SlicedData1 = df[df.colname>somenumber]]

これは、数値以外のデータなどの他の基準を含めるように簡単に拡張できます。

SlicedData2 = df[(df.colname1>somenumber & df.colname2=='24/08/2018')]

等々...

0
Adr

また、追加のステートメントが必要な場合、panda.Seriesを使用すると、シリーズ間で操作を実行できます(+、-、/ 、、 *)。

インデックスを乗算するだけです。

idx1 = df['lat'] == 49
idx2 = df['lng'] > 15 
idx = idx1 * idx2

new_df = df[idx] 
0
Manuel

enumerateの代わりに、私は通常_.iteritems_を使用します。これにより、.index()が保存されます。つまり、

_[k for k, v in (df['c'] > t).iteritems() if v]
_

そうでなければ、人はしなければなりません

_df[df['c'] > t].index()
_

これにより、データフレーム名の入力が重複します。これは、入力に非常に時間がかかり、面倒な場合があります。

0
wdwd