我想计算每组中不同元组的数量:
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',有四个不同的元组,对于组' B',有两个。
我尝试使用df.groupby('a')['b', 'c'].nunique()
,但nunique
仅适用于一列。
我知道我可以通过df.groupby计算不同的元组([' b',' c']),但这意味着我使用了慢速apply
一个纯python函数(列的组数' a'很大)。
我可以转换' b'和' c'将列放入单个元组列中,但这样会超级慢,因为它将不再使用向量化操作。
答案 0 :(得分:3)
我认为您的逻辑相当于在删除组合列a
,a
和b
的重复值后,计算按列c
分组的数据框的大小,因为每个组中的重复元组也必须是数据框中的重复记录,假设您的数据框仅包含a
,b
和c
列,反之亦然:
df.drop_duplicates().groupby('a').size()
# a
# A 4
# B 2
# dtype: int64