2017-01-26 8 views
1

ディードルフレームからいくつかのキーで行の位置を取得するには?私が意味する位置によって

let position:int = positionForKey frame key 
let row = 
    Frame.take positionForKey 
    |> frame.takeLast 1 

はその後、rowは、キーkeyある一列のみ、とのフレームでなければなりません。

私には分かりませんが、達成する方法はpositionForKeyです。一つのアイデアはうまくいくはずだが、それがベストプラクティスであるかどうかわからないのは、別のSeriesSeries.scanValues経由で作成し、その値を位置にすることだが、もっと優雅なやり方が必要だと思う。 Series.scanValues経由

実装は次のようになります。

let positionForKey (frame:Frame<'K,_>) (key:'K) = 
    let positions = Series.scanValues (fun pos _ -> pos + 1) 0 (frame.GetColumnAt 0) 
    positions.[key] 

...インデックスは

あなたは、フレーム、このようfを持っていると言う例1

から始まる:

03/01/01, 4 , ... 
04/01/01, 3 , ... 
05/01/01, 6 , ... 
    ... , ..., ... 

,positionforKey f 04/01/01 = 2,positionforKey f 05/01/01 = 3などとなる。

+1

@FoggyFinderもちろん、しました。 –

答えて

3

Deedleには実際にこれを行うための機能が組み込まれていますが、あまりよく書かれていません(これは主に「仮想フレーム」のサポートを追加するときにかなり変化しているためです)。

しかし、サンプル・データ・フレームを考慮する:

let ts = series [ for i in 0 .. 365 -> DateTime(2017, 1, 1).AddDays(float i) => float i] 
let df = frame ["Sample" => ts ] 

データフレームは、インデックスを使用してルックアップが実行される方法を表す行インデックスを有しています。RowIndexを使用して、キーを検索し、インデックスに返されたアドレスを変換することができます

let addr = df.RowIndex.Locate(DateTime(2017, 5, 1)) 
let idx = df.RowIndex.AddressOperations.OffsetOf(addr) 

そして、あなたはこの行にフレームを取得することができます。

df.GetRowsAt([| int idx |]) 

アドレスaddrだけですメモリ内のデータフレームで作業しているときのインデックスですが、in virtual data framesは、行が格納されている場所をエンコードする数値なので、オフセットに直接マッピングされません。そのため、アドレスを実際のインデックスにマップするOffsetOfコールを追加しました。インメモリフレームの場合は、これについて心配する必要はありません。

キーが見つからない場合、addrの値は-1Lになります(これを確認するには、原則としてAddressing.Address.invalidを使用する必要があります)。

+1

ああ、これは非常にいいです、私はコード内の 'Address'を見て、それが何で、どのように' .RowIndex'が使用できるのだろうと思っていました! – s952163

2

.RowIndexなど、いくつかの方法でキーの位置を抽出することができます。しかし、最も簡単な方法はおそらくキーを取得し、インデックスを見つけることです。 TryFindIndexを使用したい場合があります.dfはDateTimeでインデックス付けされたデータフレームです。

df.RowKeys |> Seq.findIndex(fun x -> x = DateTime(2017,5,6))

あなただけの指定したインデックス位置にある列を返すようにしたい場合は、そのための拡張メソッドがあります。ここでは、インデックスによって行で取得するためのいくつかの方法があります。

(Frame.getRow (DateTime(2017,5,6)) df):Series<string,string>

または

df.Rows.[(DateTime(2017,5,6))]

あなたは手の込んだ何かをしたい場合は、確かにDeedleに相談し、Frame docs必要があります。

+2

findIndexメソッドがより効率的ですが、私はpositionForKeyの定義を変更しますが、まだもっと良い方法であるべきだと私は考えています。私はドキュメントをスキミングし、私は何か良いものを見つけられなかった、多分私はそれを逃した。ありがとう! –

関連する問題