如何按行统计唯一值并执行groupby分组操作?
按行统计唯一值数量的两种实现方式
先还原你提供的示例表格:
| Box1 | Box2 | Box3 | Count Result 1 | Count Result 2 | Count Result 3 |
|---|---|---|---|---|---|
| Data A | Data A | Data B | Data A = 2 | Data B = 1 | |
| Data C | Data D | Data B | Data C = 1 | Data D = 1 | Data 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
相关产品推荐
相关产品推荐

