Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将每个组的唯一值计数为带参数的新列_Python_Pandas_Dataframe_Group By_Pandas Groupby - Fatal编程技术网

Python 将每个组的唯一值计数为带参数的新列

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.

我想计算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')
(这显然不起作用)

通过获取唯一的摘要数据帧并将其连接到原始数据帧,可以实现所需的结果,但我想知道是否有更简单的解决方案

谢谢

你很接近了

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
列中缺少的值。