如何将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
相关产品推荐
相关产品推荐

