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

如何按行统计唯一值并执行groupby分组操作?

按行统计唯一值数量的两种实现方式

先还原你提供的示例表格:

Box1Box2Box3Count Result 1Count Result 2Count Result 3
Data AData AData BData A = 2Data B = 1
Data CData DData BData C = 1Data D = 1Data B = 1

你不需要强制先执行转置操作,两种思路都能实现按行统计唯一值的需求:

方法1:不转置,直接按行处理

利用apply结合value_counts逐行统计,再整理成目标格式:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'Box1': ['Data A', 'Data C'],
    'Box2': ['Data A', 'Data D'],
    'Box3': ['Data B', 'Data B']
})

# 定义行统计函数
def count_unique(row):
    counts = row.value_counts().reset_index()
    counts = counts.apply(lambda x: f"{x['index']} = {x[0]}", axis=1)
    # 补全空值到3个结果列
    while len(counts) < 3:
        counts = counts.append(pd.Series(['']), ignore_index=True)
    return pd.Series(counts.values, index=['Count Result 1', 'Count Result 2', 'Count Result 3'])

# 应用函数并合并结果
result_df = df.join(df.apply(count_unique, axis=1))
print(result_df)

运行后会得到和示例一致的输出。

方法2:转置后分组统计

如果习惯用转置+分组的思路,也可以实现:

# 转置并重置索引,把行号作为分组依据
melted_df = df.reset_index().melt(id_vars='index', var_name='Box', value_name='Data')

# 按行号分组统计
grouped = melted_df.groupby('index')['Data'].value_counts().reset_index(name='Count')

# 整理成目标列格式
pivoted = grouped.pivot(index='index', columns=grouped.groupby('index').cumcount(), values=['Data', 'Count'])
pivoted.columns = [f"Count Result {i+1}" for i in range(pivoted.shape[1]//2)]
pivoted = pivoted.apply(lambda x: f"{x['Data']} = {x['Count']}", axis=1).unstack()

# 合并回原数据
result_df = df.join(pivoted).fillna('')
print(result_df)

两种方法都能达到目标,第一种直接针对行处理,代码更简洁;第二种适合习惯用分组透视的场景,按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:15:48