新手 Python 问题:如何跨多个预测变量和结果变量创建交叉表

Novice Python question: How to create crosstabs across multiple predictor variables and outcome variable

使用以下包含二进制 0/1 变量的测试数据框:

test_df = pd.DataFrame([
    [0, 0, 0, 1],
    [1, 0, 1, 1],
    [0, 0, 0, 1],
    [1, 0, 1, 0],
    [0, 0, 0, 0],
    [1, 0, 1, 0]], columns=["y", "age_catg", "race_catg", "sex_catg"])

我想使用 pd.crosstab() 函数创建 y 与 age_catg、race_catg、sex_catg 的双向表,以便检查预测变量类别之间的 y 值完全分离。

我的实际数据框包含数千个预测变量,因此与其明确命名年龄、种族和性别预测变量,我更愿意使用列 #'s。但是,我仍然对 Python 中的行和列引用感到困惑 - 例如以下代码不起作用:

desc_tab = pd.crosstab(test_df[:,1],  test_df[:,2:4])     
desc_tab

要使用整数索引,您需要 iloc 方法:

pd.crosstab(test_df.iloc[:, 1], test_df.iloc[:, 2])

输出:

race_catg  0  1
age_catg       
0          3  3

如果将多个 arrays/series 放在列表中,则可以将它们传递给列或行:

pd.crosstab(test_df.iloc[:, 1], [test_df.iloc[:, 2], test_df.iloc[:, 3]])

race_catg  0     1
sex_catg   0  1  0  1
age_catg             
0          1  2  2  1

编辑

如果要按索引批量定义列(list是python中的保留字,请勿使用):

cols = [test_df.iloc[:, i] for i in [2, 3]]
pd.crosstab(test_df.iloc[:, 1], cols)

输出:

race_catg  0     1   
sex_catg   0  1  0  1
age_catg             
0          1  2  2  1