2017-03-05 10 views
3

ある列のデータを別の列のデータでグループ化しようとしていますが、特定の時間範囲のデータのみが必要です。 2015年11月1日から2016年4月30日まで私はこのようになります出力(人がいる場合、その時間窓の間にログインして0またはfalseの場合、それは1または真のみを示して取得しようとしています日付範囲でグループ化する方法

account_id employer_key login_date 
1111111  google   2016-03-03 20:58:36.000000 
2222222  walmart   2015-11-18 11:52:56.000000 
2222222  walmart   2015-11-18 11:53:14.000000 
1111111  google   2016-04-06 23:29:04.000000 
3333333  dell_inc  2015-09-05 14:13:53.000000 
3333333  dell_inc  2016-01-28 03:20:58.000000 
2222222  walmart   2015-09-03 00:11:38.000000 
1111111  google   2015-09-03 00:12:25.000000 
1111111  google   2015-11-13 01:59:59.000000 
4444444  google   2015-11-13 01:59:59.000000 
5555555  dell_inc  2015-03-12 01:59:59.000000 

:私のデータベースには、次のようになります彼らはしませんでした):

employer_key account_id login_date 
google  1111111  1 
       4444444  1 
walmart  2222222  1 
dell_inc  3333333  1 
dell_inc  5555555  0 

これを行うにはどうすればいいですか?

+0

希望する出力に対応する日付範囲の例を指定できますか? –

+0

申し訳ありませんが、それは別の質問です、私はそれを再開しました。私はあなたが完全に異なった "フィルタリング"が必要であることに気付かなかった... – MaxU

答えて

2

あなたはそれをこのように行うことができます。

In [252]: df.groupby(['employer_key','account_id']) \ 
    ...: .apply(lambda x: len(x.query("'2015-11-01' <= login_date <= '2016-04-30'")) > 0) \ 
    ...: .reset_index() 
Out[252]: 
    employer_key account_id  0 
0  dell_inc  3333333 True 
1  dell_inc  5555555 False 
2  google  1111111 True 
3  google  4444444 True 
4  walmart  2222222 True 

またはboolean indexingを使用して:

In [249]: df.groupby(['employer_key','account_id'])['login_date'] \ 
    ...: .apply(lambda x: len(x[x.ge('2015-11-01') & x.le('2016-04-30')]) > 0) 
Out[249]: 
employer_key account_id 
dell_inc  3333333  True 
       5555555  False 
google  1111111  True 
       4444444  True 
walmart  2222222  True 
Name: login_date, dtype: bool 

またはそれに加えてreset_index()を使用して:フラグへ

In [250]: df.groupby(['employer_key','account_id'])['login_date'] \ 
    ...: .apply(lambda x: len(x[x.ge('2015-11-01') & x.le('2016-04-30')]) > 0) \ 
    ...: .reset_index() 
Out[250]: 
    employer_key account_id login_date 
0  dell_inc  3333333  True 
1  dell_inc  5555555  False 
2  google  1111111  True 
3  google  4444444  True 
4  walmart  2222222  True 
2

使用betweengroupby + maxへ行を取得します。

s = df.set_index(['employer_key', 'account_id']).login_date 
flag = s.between('2015-11-01', '2016-04-30').astype(np.uint8) 
flag.groupby(level=[0, 1]).max().reset_index() 

    employer_key account_id login_date 
0  dell_inc  3333333   1 
1  dell_inc  5555555   0 
2  google  1111111   1 
3  google  4444444   1 
4  walmart  2222222   1