Pandas 多索引交叉表
您好,我正在尝试从多索引变量“df”获取交叉表: df.tail() 我想得到如下信息: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 在
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