数据框架中两组列之间的交叉制表

时间:2019-01-17 18:07:02

标签: python pandas dataframe pivot-table crosstab

我试图获取由slice指定的数据的交叉表。

但是语法有些错误。

data.csv如下所示

ia,ib,ic,id,ie,if,ig  
a,0,0,0,e,0,g         
0,b,0,0,e,f,0         
0,0,c,d,0,f,g         

然后像下面这样python3 test.py

import pandas as pd
import enum

df = pd.read_csv('data.csv')

class Slices(enum.Enum):
    first = slice(0, 2)
    second = slice(4, 6)

def getCrosstab(*args):
    cols1 = []
    cols1.append(df.iloc[:, args[0].value])
    cols2 = []
    cols2.append(df.iloc[:, args[1].value])
    print( pd.crosstab(cols1, cols2) )

if __name__ == '__main__':
    getCrosstab(Slices.first, Slices.second)

预期结果:

col2 ie if ig
col1
ia   1  0  1
ib   1  1  0
ic   0  1  1

但是我有一个错误:
ValueError:传递的值的形状为(2,2),索引表示为(2,3)

我无法完全理解此错误的含义。

请给我您的指导。

1 个答案:

答案 0 :(得分:1)

melt两次,每组列一次,然后调用crosstab

u = (df.melt(['ia', 'ib', 'ic'], var_name='C', value_name='D')
       .melt(['C', 'D'], var_name='A', value_name='B')
       .query("B != '0' and D != '0'"))

pd.crosstab(u.A, u.C)

C   id  ie  if  ig
A                 
ia   0   1   0   1
ib   0   1   1   0
ic   1   0   1   1

def crosstab_for(df, sliceA, sliceB):
    u = (df.reindex(df.columns[sliceA] | df.columns[sliceB], axis=1)
           .melt(df.columns[sliceA], var_name='C', value_name='D')
           .melt(['C', 'D'], var_name='A', value_name='B')
           .query("B != '0' and D != '0'"))

    return pd.crosstab(u.A, u.C)

crosstab_for(df, slice(0, 3), slice(4, 7))

C   ie  if  ig
A             
ia   1   0   1
ib   1   1   0
ic   0   1   1