DataFrame 内のデータの各行について、列内の一意の値の数を計算し、その特定の行と、別の列で識別されるグループ内の参照行についてA
計算したいと思います。おもちゃのデータセットは次のとおりです。B
ID
d = {'ID' : pd.Series([1,1,1,2,2,2,2,3,3])
,'A' : pd.Series([1,2,3,4,5,6,7,8,9])
,'B' : pd.Series([1,2,3,4,11,12,13,14,15])
,'REFERENCE' : pd.Series([1,0,0,0,0,1,0,1,0])}
data = pd.DataFrame(d)
データは次のようになります。
In [3]: data
Out[3]:
A B ID REFERENCE
0 1 1 1 1
1 2 2 1 0
2 3 3 1 0
3 4 4 2 0
4 5 11 2 0
5 6 12 2 1
6 7 13 2 0
7 8 14 3 1
8 9 15 3 0
ここで、 を使用して定義された各グループ内で、各レコードを参照レコードと比較し、組み合わせの一意の数と値ID
を計算したいと考えています。たとえば、データ レコード 3 の値を計算するには、これを 3 にすると次のようになります。結果は次のようになります。A
B
len(set([4,4,6,12]))
A B ID REFERENCE CARDINALITY
0 1 1 1 1 1
1 2 2 1 0 2
2 3 3 1 0 2
3 4 4 2 0 3
4 5 11 2 0 4
5 6 12 2 1 2
6 7 13 2 0 4
7 8 14 3 1 2
8 9 15 3 0 3
これを実装する唯一の方法は、グループ化された各オブジェクトをループし、次にグループ化されたオブジェクト内の各レコードをループし、参照レコードに対して計算する for ループを使用することです。これは非 Pythonic であり、非常に遅いです。誰かが同じことを達成するためのベクトル化されたアプローチを提案できますか?