2017-08-06 55 views
2

我具有下面给出一个数据集:入门在熊猫交叉表的每个元素

a,b,c 
1,1,1 
1,1,1 
1,1,2 
2,1,2 
2,1,1 
2,2,1 

我创建与熊猫交叉表:

cross_tab = pd.crosstab(index=a, columns=[b, c], rownames=['a'], colnames=['b', 'c']) 

我的交叉给出作为输出:

b  1  2 
c  1 2 1 
a   
1  2 1 0 
2  1 1 1 

我想遍历这个交叉表,给定每个a,b和c值。我怎样才能得到如cross_tab[a=1][b=1, c=1]这样的值?谢谢。

回答

2

您可以使用slicers

a,b,c = 1,1,1 
idx = pd.IndexSlice 
print (cross_tab.loc[a, idx[b,c]]) 
2 

您也可以重塑df通过DataFrame.unstackreorder_levels然后用loc

a = cross_tab.unstack().reorder_levels(('a','b','c')) 
print (a) 
a b c 
1 1 1 2 
2 1 1 1 
1 1 2 1 
2 1 2 1 
1 2 1 0 
2 2 1 1 
dtype: int64 

print (a.loc[1,1,1]) 
2 
+0

谢谢你为你的swer。我现在有另一个问题。如果我给print(cross_tab2.loc [2,2,2]),它会返回错误。如何获得交叉表中的a,b和c的值? – user3104352

+0

你想用'a'循环吗?或者如果'print(cross_tab2.loc [2,2,2])'输出什么? – jezrael

+0

我其实我想循环所有可能的组合,为a,b,c。或者我可以循环存在于交叉表中的a,b,c的所有值。 (a,b,c) print(x)'?可以使用'for(a,b,c),x in a.iteritems(): – user3104352

1

您正在寻找df2.xxx.get_level_values

In [777]: cross_tab.loc[cross_tab.index.get_level_values('a') == 1,\ 
         (cross_tab.columns.get_level_values('b') == 1)\ 
         & (cross_tab.columns.get_level_values('c') == 1)] 
Out[777]: 
b 1 
c 1 
a 
1 2