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

按值筛选相同类型的数据帧

  •  0
  • dabadaba  · 技术社区  · 7 年前

    我有一个 DataFrame 本质上联系 Type1 Type2 df[t1][t2] 始终返回类型的状态 State . 的内容 数据文件 建议我应该使用 numpy 数组,但我需要能够像字典一样索引它,这就是为什么我使用 数据文件 . 如果有更好的设计方法,请告诉我。

    我想收集一份 type1,type2 它们的值在 df 与特定状态匹配。我可以过滤一行:

    row = df[type1]
    row[row == state]
    

    但是我怎么能过滤整个 数据文件 ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   jezrael    7 年前

    我建议把格式改成 MultiTndex Series :

    np.random.seed(100)
    df = pd.DataFrame(np.random.randint(10, size=(3,3)), columns=list('ABC'))
    print (df)
       A  B  C
    0  8  8  3
    1  7  7  0
    2  4  2  5
    
    a = df.stack()
    print (a)
    0  A    8
       B    8
       C    3
    1  A    7
       B    7
       C    0
    2  A    4
       B    2
       C    5
    dtype: int32
    
    b = a[a == 8].index.remove_unused_levels().tolist()
    print (b)
    [(0, 'A'), (0, 'B')]
    

    编辑:

    为了更好的性能可以使用 numpy.where 对于匹配值的索引,然后 zip 索引索引和列名称到元组:

    np.random.seed(100)
    df = pd.DataFrame(np.random.randint(10, size=(3,3)), columns=list('ABC'))
    print (df)
       A  B  C
    0  8  8  3
    1  7  7  0
    2  4  2  5
    
    a =  np.where(df == 8)
    print (a)
    (array([0, 0], dtype=int64), array([0, 1], dtype=int64))
    
    b = list(zip(df.index[a[0]], df.columns[a[1]]))
    print (b)
    [(0, 'A'), (0, 'B')]