在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
相关产品推荐
相关产品推荐

