1列のアイテムのペアの数を数えたいのですが。私はそれに対する解決策を作りましたが、もっと簡潔な解決策があるかどうか知りたいです。
これが例と私のアプローチです。私はこのようなDataFrameを持っています。
df = pd.DataFrame({'id':[1,1,2,2], 'item':['apple','orange','orange','apple']})
最後に、どの商品が最も一緒に購入されているのか知りたいです。したがって、この場合、オレンジとリンゴが最も一緒に購入されるという結果を得たいと思います。
次に、id
列の値に基づいてグループ化を行いました。
id_group = df.groupby('id')
次に、item
列内のアイテムのペアの数を数えるために、次のような関数を作成し、のitem
列に適用しましたid_group
。この後、を使用してタプルのリストを結合しましたsum()
。最後に、Counter()
同じアイテムを含むペアの数を数えていました。でcombos()
、私はsorted()
カウントを避け('apple','orange')
て('orange','apple')
別々に使用していました。
2ペア('apple','orange')
または2ペアがあることを示す結果を得るためのより良いアプローチはありますか('orange','apple')
import itertools
from collections import Counter
def combos(x):
combinations = []
num = x.size
while num != 1:
combinations += list(itertools.combinations(x,num))
num -= 1
element_sorted = map(sorted,combinations)
return list(map(tuple,element_sorted))
k= id_group['item'].apply(lambda x:combos(x)).sum()
Counter(k)
ペア、トリプルのall_subsets
場合に変更0
を加えた関数を使用します2
...ソリューションのように:
#https://stackoverflow.com/a/5898031
from itertools import chain, combinations
def all_subsets(ss):
return chain(*map(lambda x: combinations(ss, x), range(2, len(ss)+1)))
そして、値をフラット化するためにsum
、リストを連結するために使用しない方がよいと思います。見た目は派手ですが、2次式であり、悪い習慣と見なす必要があります。
したがって、ここではリスト内包表記でソートされたタプルを使用したフラット化を使用します。
k = [tuple(sorted(z)) for y in id_group['item'].apply(all_subsets) for z in y]
print (Counter(k))
Counter({('apple', 'orange'): 2})
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加