代码之家  ›  专栏  ›  技术社区  ›  user3104352

获取Pandas交叉表中的每个元素

  •  2
  • user3104352  · 技术社区  · 8 年前

    我的数据集如下:

    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] ? 非常感谢。

    3 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    slicers :

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

    您还可以重塑 df DataFrame.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
    
        2
  •  2
  •   cs95 abhishek58g    8 年前

    您正在寻找 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
    
        3
  •  0
  •   Alok Lal    5 年前

    另一种考虑方法是,尽管有一点可读性损失,但可以简单地使用 .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==11 c==23

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

    为什么这样做? .loc 标签 .在数据帧输出中 交叉表 以前的列值现在成为索引标签 因此 .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]
    

    这将产生:

    a 列是按顺序排列的 [b, c] .你必须知道这一点才能理解 交叉选项卡。loc[2]。loc[11]。loc[23] 可以。但我发现这往往是一个很好的权衡。