2017-12-12 6 views
2

申し訳ありませんが、これは数日間困惑しています。パンダはグループ内の共起のバイナリカウントを取得します

のは、私は、次のデータフレームの形式でいくつかのユーザインタラクションデータを持っているとしましょう:

user_id_a | user_id_b | time 
    2   5  2017-12-12 14:00 
    1   7  2017-12-12 14:20 
    2   5  2017-12-12 14:40 
    2   5  2017-12-13 11:00 
    4   12  2017-12-15 9:00 

私は、彼らが特定の時間枠内で相互作用するかどうかのバイナリ数の合計をしたい...例えばそう、あればユーザー2と5はこれだけ、それらの相互作用の2が同じ時間枠内であった、合計3回の相互作用が、そのためこの場合には

user_id_a | user_id_b | num_time_frames_seen_together 
    2   5  2 
    1   7  1 
    4   12  1 

:時間枠は、私がで終わるしたい、1日でした1つの値が合計されました。基本的に私は私の最初の例のテーブルを与える

df = df.set_index('time').groupby(pd.Grouper(freq='1D')) 

私は限り得ています。しかし、私は本当に次のやり方として迷っています。私はPandasにはかなり新しく、行間を繰り返して手動で計算することができますが、Pandasの機能性がまだまだわかっていないと確信しています。

+0

時間枠はどのくらいですか? 2人と4人に41分の記録があったとしても、それはまだ1つに数えられますか?何時に2つの記録と見なすべきですか?別の日ですか? –

+0

と注文数は一緒に2,5と5,2加算されますか? –

+0

この例では、時間枠は1日です。そして、いいえ、順序は重要ではありません。しかし、私のデータは、最小値がuser_id_a列にあるように常にソートされます – Dusty

答えて

0

これは一番美しいものではありませんが、たとえば2,5,5の2人であっても動作します(これらは私が想定しているのと同じペアに数えます)。

groupbyに電話をかけたら、apply + value_countsに電話して、日付のカウントを取得します。 sumで日付を合計することができます。

df = df.set_index('time')\ 
     .groupby(pd.Grouper(freq='1D'))\ 
     .apply(lambda x: x.apply(frozenset, 1).value_counts() > 0)\ 
     .sum(level=1) 
df 

(2, 5)  2.0 
(1, 7)  1.0 
(4, 12) 1.0 
dtype: float64 
0

のはdt.floornuniqueを使用してみましょう:

df.assign(day = df['time'].dt.floor('D')).groupby(['user_id_a','user_id_b'])['day'].nunique()\ 
    .reset_index(name='num_seen_together') 

出力:

user_id_a user_id_b num_seen_together 
0   1   7     1 
1   2   5     2 
2   4   12     1 
関連する問題