2016-09-05 18 views
2

私は各グループ内の個別のタプルの数をカウントします:つまりCOUNTグループ内のDISTINCT/nunique

df = pd.DataFrame({'a': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 
       'b': [1, 2, 1, 2, 1, 2, 1, 2], 
       'c': [1, 1, 2, 2, 2, 1, 2, 1]}) 
counts = count_distinct(df, by='a', columns=['b', 'c']) 
assert counts == pd.Series([4, 2], index=['A', 'B']) 

、カウントはグループ「A」のために、4つの異なるタプルがあることを報告し、ために必要がありますグループ 'B'には2つあります。

df.groupby('a')['b', 'c'].nunique()を試しましたが、nuniqueは1つの列でのみ動作します。

私はdf.groupby(['b'、 'c'])によって別個のタプルを数えることができると知っていますが、それは純粋なpython関数を使って遅いapplyを使用したことを意味します' は大きい)。

'b'列と 'c'列をタプルの1つの列に変換できますが、ベクトル化された操作を使用しなくなるため、非常に遅くなります。

答えて

3

は、私は、各グループ内の重複したタプルは、データフレーム内のレコードを複製する必要がありますので、あなたのロジックは、組み合わせの列abcの重複値を落とした後、カラムaでグループ化されたデータフレームのサイズをカウントすることと等価であると思います

df.drop_duplicates().groupby('a').size() 

# a 
# A 4 
# B 2 
# dtype: int64 
+1

私は多くの列を持っていましたが、drop_duplicatesに、 '='引数をサブセットを使用することにより、それに対処することができます:あなたのデータフレームと仮定すると列だけabcとその逆が含まれています。 – max

関連する問題