Python 将每个组的唯一值计数为带参数的新列
我想计算pandas数据框中一个组的唯一观测值,并创建一个具有唯一计数的新列。重要的是,我不想减少数据帧中的行;有效地执行类似于SQL中的窗口函数的操作Python 将每个组的唯一值计数为带参数的新列,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,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.
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')
(这显然不起作用)
通过获取唯一的摘要数据帧并将其连接到原始数据帧,可以实现所需的结果,但我想知道是否有更简单的解决方案
谢谢你很接近了
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
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
谢谢Peter,在我的原始数据上,我得到了一个ValueError:长度不匹配:预期的axis有29101个元素,新的值有29457个元素,我甚至没有创建一个新列,只是给一个新变量赋值。你的解决方案确实回答了这个问题,对这个错误有什么想法吗?编辑:NA值是这里的罪魁祸首。@ZeroStack,这可能是这个错误:我会尝试df.fillna(0).groupby(…),如果这样做有效,请进一步研究如何填充mID
和/或uID
列中缺少的值。