使用Pandas按组计算唯一值的数量,并将其作为新列添加。

4

我想在pandas数据框中按组计算唯一观察值,并创建一个具有唯一计数的新列。重要的是,我不想减少数据框中的行;实际上执行类似于SQL中的窗口函数的操作。

df = pd.DataFrame({
         'uID': ['James', 'Henry', 'Abe', 'James', 'Henry', 'Brian', 'Claude', 'James'],
         'mID': ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'C']
})

df.groupby('mID')['uID'].nunique()

将按组获取唯一计数,但它会汇总(减少行数),我想要做的实际上是:

df['ncount'] = df.groupby('mID')['uID'].transform('nunique')

(这显然不起作用)

可以通过将唯一的汇总数据框与原始数据框连接来实现所需的结果,但我想知道是否有更简单的解决方案。

谢谢

2个回答

6

GroupBy.transform('nunique')

在版本 v0.23.4 上,您的解决方案对我有效。

df['ncount'] = df.groupby('mID')['uID'].transform('nunique')
df
      uID mID  ncount
0   James   A       5
1   Henry   B       2
2     Abe   A       5
3   James   B       2
4   Henry   A       5
5   Brian   A       5
6  Claude   A       5
7   James   C       1

GroupBy.nunique + pd.Series.map

此外,使用您现有的解决方案,您可以将系列映射回 mID

df['ncount'] = df.mID.map(df.groupby('mID')['uID'].nunique())
df
      uID mID  ncount
0   James   A       5
1   Henry   B       2
2     Abe   A       5
3   James   B       2
4   Henry   A       5
5   Brian   A       5
6  Claude   A       5
7   James   C       1

3

你已经非常接近了!

df['ncount'] = df.groupby('mID')['uID'].transform(pd.Series.nunique)

      uID mID  ncount
0   James   A       5
1   Henry   B       2
2     Abe   A       5
3   James   B       2
4   Henry   A       5
5   Brian   A       5
6  Claude   A       5
7   James   C       1

谢谢Peter,我在原始数据上遇到了一个ValueError: 长度不匹配:期望轴有29101个元素,新值有29457个元素,我甚至没有创建一个新列,只是分配给一个新变量。你的解决方案确实回答了问题,对于这个错误有什么想法吗? 编辑:NA值是罪魁祸首。 - ZeroStack
@ZeroStack,可能是这个bug:https://github.com/pandas-dev/pandas/issues/17093 我会尝试使用df.fillna(0).groupby(...),如果这样行得通,就进一步调查如何填充列“mID”和/或“uID”的任何缺失值。 - Peter Leimbigler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接