データフレームの特定の列と比較するユーザ定義の番号があります。ユーザ定義の番号に最も近いデータフレームの行を返します
私は与えられた番号xに5つの最も近い数字を含むデータフレームの行を返すことを望みます(df.numの特定の列で)。
これをループなしで行う最良の方法についてのご意見は、大変ご好評いただきます。
データフレームの特定の列と比較するユーザ定義の番号があります。ユーザ定義の番号に最も近いデータフレームの行を返します
私は与えられた番号xに5つの最も近い数字を含むデータフレームの行を返すことを望みます(df.numの特定の列で)。
これをループなしで行う最良の方法についてのご意見は、大変ご好評いただきます。
私はあなたがargsort
メソッドを使用することができると思います:pythonとパンダに新しいの
>>> df = pd.DataFrame({"A": 1e4*np.arange(100), "num": np.random.random(100)})
>>> x = 0.75
>>> df.ix[(df.num-x).abs().argsort()[:5]]
A num
66 660000 0.748261
92 920000 0.754911
59 590000 0.764449
27 270000 0.765633
82 820000 0.732601
>>> x = 0.33
>>> df.ix[(df.num-x).abs().argsort()[:5]]
A num
37 370000 0.327928
76 760000 0.327921
8 80000 0.326528
17 170000 0.334702
96 960000 0.324516
種類を私はこれをお勧めします。
#make random df and get number
df = pd.DataFrame({'c1':0,'c2':np.random.random(100)})
x = .25
#find differences and sort
diff = df.c2.apply(lambda z: abs(x-z))
diff.sort()
#get the index for the 5 closest numbers
inds = diff.index[:5]
inds
その後、5つの最も近い数字の元DFからのインデックスの場所を持っているでしょう。お役に立てれば!
これを一般化すると、5つの最も近い行が得られると仮定します(n個の入力があり、n個の異なる列への近さを測定したい場合)。あなたはまだこのようにしますか?もしn = 2ならば(例えばx = 0.75、y = 5.0)、 "&" df.ix [(df.num1-x).abs()。argsort()[:5]& df.num2-y).abs()。argsort()[:5]]?ありがとうございました! –
パンダのインターフェースが変わったのですか? 'df.ix'の代わりに' df.iloc'を使う必要があります。そうでなければ、フィールドはすべて 'NaN'です。 – swenzel
ああ問題は自分のdfのインデックスにあると思う、それは 'range(len(df))'のようなシーケンスではない。しかし、ilocは普通のインデックスと私のインデックスの両方で動作するようです。私はパンダにはあまり経験がありませんが、このような挙動は 'iloc'を使用する方がより安定していることを示唆していますか? – swenzel