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

在R中按类别及二进制类别分组二进制数据框的问题

我明白你想要实现的需求了——按第一列的类别分组,同时对后续每一列的二进制值再做分组统计对吧?先给你搭个清晰的场景,咱们从示例数据入手,一步步解决问题。

第一步:先明确数据结构(示例)

首先假设你的数据框df长这样(和你描述的结构一致:第一列是2个类别,后续列都是二进制0/1数据):

import pandas as pd

data = {
    'Category': ['GroupA', 'GroupA', 'GroupB', 'GroupB', 'GroupA'],
    'Col1': [1, 0, 1, 0, 1],
    'Col2': [0, 0, 1, 1, 0],
    'Col3': [1, 1, 0, 1, 0]
}
df = pd.DataFrame(data)

第二步:两种实现方案(按需选择)

根据你想要的最终结果结构,这里提供两种常用的解决方案:

方案1:类别作为行索引,二进制值作为列层级

如果你希望结果是每个类别一行,后续列按「变量+二进制值」分层,可以用groupby结合value_counts:

# 按Category分组,对每列统计二进制值的出现频次
result = df.groupby('Category').apply(lambda x: x.apply(pd.Series.value_counts)).unstack(level=1)

# 整理列名层级,让结果更直观
result.columns = result.columns.reorder_levels(['Variable', 'Binary_Value'])
result = result.sort_index(axis=1)

运行后得到的结果结构:

Col1        Col2        Col3       
Binary_Value   0    1    0    1    0    1
Category                                 
GroupA         1    2    3    0    1    2
GroupB         1    1    0    2    1    1

如果想要占比而非计数,把pd.Series.value_counts改成pd.Series.value_counts(normalize=True)即可。

方案2:类别+二进制值作为复合行索引

如果你希望结果是每个「类别+二进制值」组合一行,变量作为列,可以先转成长格式再统计:

# 将宽格式数据转成长格式
melted_df = df.melt(id_vars='Category', var_name='Variable', value_name='Binary_Value')

# 用交叉表统计频次
result = pd.crosstab([melted_df['Category'], melted_df['Binary_Value']], melted_df['Variable'])

运行后得到的结果结构:

Variable             Col1  Col2  Col3
Category Binary_Value               
GroupA   0              1     3     1
         1              2     0     2
GroupB   0              1     0     1
         1              1     2     1

补充说明

如果你的「指定结构」和上面两种都不一样,或者你的尝试代码有具体的错误点,可以把代码贴出来,我再帮你针对性调整~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:59:22