组内的COUNT DISTINCT / nunique

时间:2016-09-05 02:06:26

标签: python python-3.x pandas

我想计算每组中不同元组的数量:

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'将列放入单个元组列中,但这样会超级慢,因为它将不再使用向量化操作。

1 个答案:

答案 0 :(得分:3)

我认为您的逻辑相当于在删除组合列aab的重复值后,计算按列c分组的数据框的大小,因为每个组中的重复元组也必须是数据框中的重复记录,假设您的数据框仅包含abc列,反之亦然:

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

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