使用 pandas 将每组的唯一值计数为新列

Zer*_*ack 4 python group-by dataframe pandas pandas-groupby

我想计算 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()
Run Code Online (Sandbox Code Playgroud)

将获得每个组的唯一计数,但它会总结(减少行数),我实际上想做一些类似的事情:

df['ncount'] = df.groupby('mID')['uID'].transform('nunique')
Run Code Online (Sandbox Code Playgroud)

(这显然行不通)

通过采用独特的汇总数据帧并将其连接到原始数据帧,可以实现所需的结果,但我想知道是否有更简单的解决方案。

谢谢

cs9*_*s95 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
Run Code Online (Sandbox Code Playgroud)

GroupBy.nunique+pd.Series.map

此外,利用现有的解决方案,您可以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
Run Code Online (Sandbox Code Playgroud)