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

如何将pandas的crosstab输出转为数组,实现R的table函数分样本频数统计效果

import pandas as pd

# 首先构造和R示例一致的测试数据
df = pd.DataFrame({
    "cell": ["c1", "c1", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8"],
    "layer": ["L1", "L1", "L2", "L1", "L2", "L3", "L3", "L4", "L4", "L3"],
    "sample": ["1", "2", "2", "1", "1", "2", "2", "2", "1", "1"]
})

方案1:基于pd.crosstab的实现

你已经生成的多重列索引交叉表,通过xs方法按层级筛选列即可得到单个样本的频数表,转数组直接调用.values属性即可:

# 生成多重列索引交叉表
xtab = pd.crosstab(index=df["cell"], columns=[df["sample"], df["layer"]])

# 提取样本1的频数表,效果等价于R中的tab[,,1]
sample1_tab = xtab.xs("1", level="sample", axis=1)
# 转numpy数组
sample1_arr = sample1_tab.values

# 提取样本2的频数表
sample2_tab = xtab.xs("2", level="sample", axis=1)
sample2_arr = sample2_tab.values

打印sample1_tab输出效果如下:

layer  L1  L2  L3  L4
cell
c1      1   0   0   0
c2      1   0   0   0
c3      0   1   0   0
c4      0   0   0   0
c5      0   0   0   0
c6      0   0   0   0
c7      0   0   0   1
c8      0   0   1   0

方案2:基于groupby的实现

按样本分组后,每组单独生成频数表,统一维度后存为字典,批量处理更方便:

sample_tab_dict = {}
all_cells = df["cell"].unique()
all_layers = df["layer"].unique()

for sample_id, group_df in df.groupby("sample"):
    # 分组生成交叉表后用reindex补全所有cell和layer的维度,缺失值填0
    tab = pd.crosstab(index=group_df["cell"], columns=group_df["layer"]) \
            .reindex(index=all_cells, columns=all_layers, fill_value=0)
    sample_tab_dict[sample_id] = tab
    # 如果只需要数组可以直接存:sample_tab_dict[sample_id] = tab.values

# 调用方式:sample_tab_dict["1"]为样本1的频数表,sample_tab_dict["2"]为样本2的频数表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 21:36:07