2017-12-19 5 views
0

は、以下の最初の2列(count & dt)のようなデータフレームを考えると、私は、表示される内容各dt(例えば7日間のウィンドウで見られる明確なdtsの数はに至るまでの(は含まない)を取得していますよnum_distinct_dts_prior_7_days)。Pythonでは、各行に関連した特定の日付ウィンドウ内にあるデータフレーム内の行のユニークなカウントを取得する最も良い方法は何ですか?

ix count   dt num_distinct_dts_prior_7_days 
0  6 2017-12-01        0 
1  2 2017-12-02        1 
2  2 2017-12-04        2 
3  9 2017-12-05        3 
4  4 2017-12-10        2 
5  7 2017-12-14        1 
6  2 2017-12-28        0 
7  3 2017-12-29        1 

これはテーブルの簡略化されたバージョンです。最終的には私のデータフレームにはさらにidという列があり、7月のウィンドウに表示されるdtsの個数はそれぞれdt,idのそれぞれになります。完全なデータセット全体に適用できる解決策がない場合は、idO(千の傾向))を繰り返すことができます。

+0

はすべてのための 'dt' – Dark

+0

一意の列' dt'列は、各 'id'に対して一意になります(例えばです使用することができます'id'私たちは' count'値を持つ一意の 'dt'のリストを持っています –

答えて

1

37番号の範囲の中央値となりますので、我々は

df['expected'] = 3-(3 - df.groupby(df.index // 7).cumcount()).abs() 

    ix count   dt num_distinct_dts_prior_7_days expected 
0 0  6 2017-12-01        0   0 
1 1  2 2017-12-02        1   1 
2 2  2 2017-12-04        2   2 
3 3  9 2017-12-05        3   3 
4 4  4 2017-12-10        2   2 
5 5  7 2017-12-14        1   1 
6 6  2 2017-12-28        0   0 
7 7  3 2017-12-29        1   0 
+0

' 7'の代わりに '6'を使う必要があるかもしれない投稿を出力するには、それはタイプミスかもしれません – Dark

+0

私は、これは一般的なアプローチではありませんか?例えば、私は、12/1/2017から12/29/2017までの連続した日付のセットを持つデータフレームを持つと、 '[0、1、2 、3、2、1、0] 'のパターンを出力し、' 7 'を最初の7行に渡し、その後のすべての行も連続した日付範囲を持つので、*は* 7になります。 –

+0

私は言葉を理解することができません、期待される出力で質問を更新する方が良いでしょう、私はgroupby中央値を使用して一般的な解決策を持っていましたが、これで十分だろうと思った。だから、より一般化された解決策の質問を更新してください。 – Dark

関連する問題