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]?谢谢你。

4

3 回答 3

2

您可以使用切片器

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

您也可以通过 重塑dfDataFrame.unstack然后reorder_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
于 2017-08-06T17:22:55.480 回答
2

您正在寻找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
于 2017-08-06T17:23:48.873 回答
0

另一种考虑的方法,尽管会失去一点可读性,可能是简单地使用.loc来导航由pandas.crosstab. 下面的例子说明了它:

import pandas as pd
import numpy as np

np.random.seed(1234)

df = pd.DataFrame(
    {
        "a": np.random.choice([1, 2], 5, replace=True),
        "b": np.random.choice([11, 12, 13], 5, replace=True),
        "c": np.random.choice([21, 22, 23], 5, replace=True),
    }
)
df

输出

    a   b   c
0   2   11  23
1   2   11  23
2   1   12  23
3   2   12  21
4   1   12  21

crosstab输出是:

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

b   11  12
c   23  21  23
a           
1   0   1   1
2   2   1   0

现在假设您想在 和 时访问值,a==2然后只需执行b==11c==23

cross_tab.loc[2].loc[11].loc[23]

2

为什么这行得通? .loc允许按索引标签选择。在由 输出的数据帧中crosstab,我们以前的列值现在变成了索引标签。因此,对于.loc我们所做的每一次选择,它都会给出与该索引标签相对应的数据帧切片。cross_tab.loc[2].loc[11].loc[23]让我们一步一步导航:

cross_tab.loc[2]

产量:

b   c 
11  23    2
12  21    1
    23    0
Name: 2, dtype: int64

下一个:

cross_tab.loc[2].loc[11]

产量:

c
23    2
Name: 2, dtype: int64

最后我们有

cross_tab.loc[2].loc[11].loc[23]

产生:

2

为什么我说这会降低可读性?因为要了解此选择,您必须了解交叉表是如何创建的,即行a和列是按顺序排列的[b, c]。你必须知道这一点才能解释cross_tab.loc[2].loc[11].loc[23]会做什么。但我发现这通常是一个很好的权衡。

于 2019-11-07T19:41:28.323 回答