Pandas 多索引交叉表

Pandas 多索引交叉表,pandas,multi-index,crosstab,Pandas,Multi Index,Crosstab,您好,我正在尝试从多索引变量“df”获取交叉表: df.tail() 我想得到如下信息: X1 X2 X3 a b c d a b c d a b c d a X1 b c d a X2 b c d a X3 b c d 在

您好,我正在尝试从多索引变量“df”获取交叉表:

df.tail()

我想得到如下信息:

             X1                X2           X3
       a   b   c   d       a  b  c  d    a  b  c  d

    a
X1  b 
    c 
    d                          
    a
X2  b 
    c
    d
    a
X3  b
    c 
    d 

在每个细胞中,得到(A,B,C,D)席的数量/百分比X/J值< /P> 我试过:

pd.crosstab(index = df, columns = df) 
但我收到一条错误消息:

ValueError: Shape of passed values is (3, 2), indices imply (605, 2)

感谢您的帮助

我没有找到使用
pd.crosstab
功能实现这一点的方法,但是可以通过双循环实现。我很想让它与有序(分类)类型一起工作,但我天真的尝试,被注释掉了,没有起作用

import pandas as pd
import numpy as np

def full_crosstab(df, row_keys=None, col_keys=None):
    row_keys = row_keys or df.columns
    col_keys = col_keys or df.columns
    df_final = []
    for outer in row_keys:
        df_outer = []
        for inner in col_keys:
            df_inner = pd.crosstab(df[outer], df[inner])
            df_outer.append(df_inner)
        df_outer = pd.concat(df_outer, axis=1, keys=col_keys)
        df_final.append(df_outer)
    return pd.concat(df_final, keys=row_keys)


def category(values, size):
    series = np.random.choice(values, size=size)
    return pd.Series(series)
    #dtype = pd.CategoricalDtype(categories=values, ordered=True)
    #return pd.Series(series, dtype=dtype)

size = 100
mydf = pd.DataFrame(dict(
    age_range=category(['<18', '18-34', '35-64', '65+'], size=size),
    reg=category(['yes', 'no'], size=size),
    issue=category(['guns', 'schools', 'healthcare'], size=size),
))


df_ct = full_crosstab(mydf)
print(df_ct)
将熊猫作为pd导入
将numpy作为np导入
def full_交叉表(df,行键=无,列键=无):
行键=行键或df列
col_keys=col_keys或df.columns
df_final=[]
对于外部行内键:
df_外部=[]
对于内置col_键:
df_inner=pd.交叉表(df[outer],df[inner])
外部附加(内部附加)
df_外部=pd.concat(df_外部,轴=1,键=列键)
df_final.append(df_外部)
返回pd.concat(df_最终,键=行键)
def类别(值、大小):
系列=np.随机.选择(值,大小=大小)
返回pd.系列(系列)
#dtype=pd.CategoricalDtype(categories=value,ordered=True)
#返回pd.Series(Series,dtype=dtype)
尺寸=100
mydf=pd.数据帧(dict(

age_range=category(['您的原始数据是否有三级列?是的。我的df有一个多索引结构,其中三级填充在您预期输出的空白处。我希望有一个列联表,即每个(XI,Xj)同时为(a,a)、(a,b)…的变量的数量/百分比
import pandas as pd
import numpy as np

def full_crosstab(df, row_keys=None, col_keys=None):
    row_keys = row_keys or df.columns
    col_keys = col_keys or df.columns
    df_final = []
    for outer in row_keys:
        df_outer = []
        for inner in col_keys:
            df_inner = pd.crosstab(df[outer], df[inner])
            df_outer.append(df_inner)
        df_outer = pd.concat(df_outer, axis=1, keys=col_keys)
        df_final.append(df_outer)
    return pd.concat(df_final, keys=row_keys)


def category(values, size):
    series = np.random.choice(values, size=size)
    return pd.Series(series)
    #dtype = pd.CategoricalDtype(categories=values, ordered=True)
    #return pd.Series(series, dtype=dtype)

size = 100
mydf = pd.DataFrame(dict(
    age_range=category(['<18', '18-34', '35-64', '65+'], size=size),
    reg=category(['yes', 'no'], size=size),
    issue=category(['guns', 'schools', 'healthcare'], size=size),
))


df_ct = full_crosstab(mydf)
print(df_ct)
                     age_range               reg     issue                   
                         18-34 35-64 65+ <18  no yes  guns healthcare schools
age_range 18-34             22     0   0   0  14   8     8          7       7
          35-64              0    24   0   0  10  14    11         10       3
          65+                0     0  23   0  13  10     9          5       9
          <18                0     0   0  31  17  14     5         14      12
reg       no                14    10  13  17  54   0    13         19      22
          yes                8    14  10  14   0  46    20         17       9
issue     guns               8    11   9   5  13  20    33          0       0
          healthcare         7    10   5  14  19  17     0         36       0
          schools            7     3   9  12  22   9     0          0      31