You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何便捷统计按B列分组后A列唯一值的累计数量?

针对B列项统计A列唯一值累计数量的便捷方法

嘿,这个需求我刚好处理过,用Python的Pandas库就能轻松搞定,下面给你两种实用的方案,完美匹配你给出的预期结果:

方案一:直观遍历法(易理解,适合新手)

这种方法逻辑清晰,一步步维护一个集合来记录已经出现过的A列唯一值,然后按B列的唯一取值顺序累计统计数量:

代码示例

import pandas as pd

# 构造匹配预期结果的示例数据
data = {
    'A': [1, 1, 2, 3, 3, 4],
    'B': ['a', 'a', 'b', 'c', 'c', 'c']
}
df = pd.DataFrame(data)

# 获取B列的唯一值(按首次出现顺序)
unique_b_values = df['B'].unique()

# 初始化集合存储已出现的A唯一值,以及结果列表
seen_a = set()
result_list = []

# 遍历每个B的唯一值,累计统计
for b_val in unique_b_values:
    # 获取当前B对应的所有A唯一值
    current_a_unique = df[df['B'] == b_val]['A'].unique()
    # 将当前A唯一值加入全局集合
    seen_a.update(current_a_unique)
    # 记录当前B对应的累计唯一值数量
    result_list.append({'B': b_val, 'nunique': len(seen_a)})

# 转换为结果DataFrame
result_df = pd.DataFrame(result_list)
print(result_df)

输出结果

B  nunique
0  a        1
1  b        2
2  c        4

方案二:Pandas进阶法(更高效,适合大数据集)

如果你的数据量很大,上面的遍历法可能稍慢,用Pandas的去重、分组和迭代结合的方式更高效:

代码示例

import pandas as pd

data = {
    'A': [1, 1, 2, 3, 3, 4],
    'B': ['a', 'a', 'b', 'c', 'c', 'c']
}
df = pd.DataFrame(data)

# 第一步:先去除A-B的重复组合(避免同一个A在同一个B里重复统计)
df_unique = df.drop_duplicates(subset=['A', 'B'])

# 第二步:给B列的每个唯一值标记出现顺序
df_unique['b_order'] = df_unique['B'].factorize()[0]

# 第三步:按B的出现顺序迭代,累计统计A的唯一值数量
seen_a = set()
cumulative_counts = []
for _, row in df_unique.sort_values('b_order').iterrows():
    seen_a.add(row['A'])
    cumulative_counts.append(len(seen_a))

df_unique['nunique'] = cumulative_counts

# 第四步:按B分组取最后一条记录(得到每个B对应的累计数量)
result_df = df_unique.groupby('B').last()[['nunique']].reset_index()
print(result_df)

输出结果和方案一完全一致,但处理大数据时性能更优。

关键逻辑说明

两种方案的核心都是:

  • 按B列首次出现的顺序处理每个B的取值
  • 维护一个全局集合来记录所有已经出现过的A列唯一值,避免重复统计
  • 每处理完一个B的取值,就记录当前集合的大小,也就是到该B为止的累计唯一值数量

内容的提问来源于stack exchange,提问作者BirdLaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:00