2017-07-14 1 views
1

私はパンダのデータフレームdfを持ち、列はuserproductです。どの製品をどのユーザーが購入したかを記述し、同じ製品を繰り返し購入することを説明します。例えば。ユーザー1が製品23を3回購入した場合、dfには、ユーザー1に対して3回のエントリ23が含まれます。 すべてのユーザーについて、そのユーザーが3回以上購入した製品のみに興味があります。したがって、私はs = df.groupby('user').product.value_counts()を実行し、その後、私は十分に頻繁に買わない製品を廃棄するためにs = s[s>2]をフィルタリングします。パンダ:groupby.value_counts()からDict

user  product 
3  39190   9 
     47766   8 
     21903   8 
6  21903   5 
     38293   5 
11  8309   7 
     27959   7 
     14947   5 
     35948   4 
     8670   4 

データをフィルタ処理したので、私はこれ以上の周波数では興味がない(右列):次に、sは次のようになります。

sに基づいてuser:productという形式の辞書を作成するにはどうすればよいですか?シリーズの個々の列/インデックスにアクセスするのに問題があります。それを解決

答えて

1

オプション0

s.reset_index().groupby('user').product.apply(list).to_dict() 

{3: [39190, 47766, 21903], 
6: [21903, 38293], 
11: [8309, 27959, 14947, 35948, 8670]} 

オプション1

s.groupby(level='user').apply(lambda x: x.loc[x.name].index.tolist()).to_dict() 

{3: [39190, 47766, 21903], 
6: [21903, 38293], 
11: [8309, 27959, 14947, 35948, 8670]} 

オプション2

from collections import defaultdict 

d = defaultdict(list) 

[d[x].append(y) for x, y in s.index.values]; 

dict(d) 

{3: [39190, 47766, 21903], 
6: [21903, 38293], 
11: [8309, 27959, 14947, 35948, 8670]} 
+0

おかげで、!オプション0では、reset_index()に新しい列名を指定しなければなりませんでした。そうでなければ、命名エラーが発生しました([here](https://stackoverflow.com/questions/39778686/pandas-reset-index-after- groupby-value-counts))。 – DominikS

関連する問題