如何用Pandas的groupby按组统计列的唯一值数量并生成新列
解决方法:基于Groupby生成唯一值计数新列
看起来你需要按_a分组,统计每个组内_b的唯一值数量,再把这个计数对应到组内的每一行生成a_b_3列。结合你的示例数据,这里有两种简洁的实现方式:
方法一:使用transform直接生成列
transform方法可以帮我们在分组后计算统计值,并自动将结果广播到原DataFrame的每一行,非常适合这种场景:
import numpy as np import pandas as pd # 初始化你的DataFrame df = pd.DataFrame({'_a':[1,1,1,2,2,3,3],'_b':[3,4,5,3,3,3,9]}) # 生成目标列a_b_3 df['a_b_3'] = df.groupby('_a')['_b'].transform('nunique') # 查看结果 print(df)
运行后输出和你给出的示例完全一致:
_a _b a_b_3 0 1 3 3 1 1 4 3 2 1 5 3 3 2 3 1 4 2 3 1 5 3 3 2 6 3 9 2
代码解释:
df.groupby('_a')['_b']:按_a的取值对_b列进行分组.transform('nunique'):对每个分组执行nunique()函数(统计该组内_b的唯一值数量),并将结果映射回原分组的每一行,这样每一行都会得到对应组的唯一值计数。
方法二:先统计分组结果再映射
如果你需要单独保存分组统计的结果,可以先计算每个_a对应的唯一值数量,再用map方法映射到原DataFrame:
import numpy as np import pandas as pd df = pd.DataFrame({'_a':[1,1,1,2,2,3,3],'_b':[3,4,5,3,3,3,9]}) # 先计算每个_a对应的_b唯一值数量 unique_counts = df.groupby('_a')['_b'].nunique() # 将统计结果映射到原df的_a列,生成a_b_3 df['a_b_3'] = df['_a'].map(unique_counts) print(df)
这个方法和transform的效果完全相同,只是把步骤拆分开了,适合需要复用分组统计结果的场景。
内容的提问来源于stack exchange,提问作者spectrum
相关产品推荐
相关产品推荐

