【问题标题】:Pandas: Filter out the rows (unique ID) that contains two desirable valuesPandas:过滤掉包含两个期望值的行(唯一 ID)
【发布时间】:2020-06-19 09:45:41
【问题描述】:

我有一个如下所示的数据框;

ID          code

333_c_132   x
333_c_132   n06
333_c_132   n36
333_c_132   n60
999_c_133   x
999_c_133   n06
999_c_133   n12
999_c_133   n24
998_c_134   x
998_c_134   n06
998_c_134   n12
998_c_134   n18
998_c_134   n36
997_c_135   x
997_c_135   n06
997_c_135   n12
997_c_135   n24
997_c_135   n36

我想过滤掉包含xn36 的行(唯一ID)。即

ID          code
333_c_132   x
333_c_132   n36
998_c_134   x
998_c_134   n36
997_c_135   x
997_c_135   n36

我试过像下面这样;

df = df[(df.code == "x") | (df.code == "n36")]

但它也返回 999_c_133 x.. 我想避免。

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    使用 Series.eq 创建布尔掩码 m1m2 然后使用 groupby 将掩码 m1m2 分组到 df[ID],现在使用 transform(any) 创建布尔值满足ID 包含值m1m2 的代码的掩码,然后使用此掩码过滤数据帧:

    m1 = df['code'].eq('x')
    m2 = df['code'].eq('n36')
    m = (
        m1.groupby(df['ID']).transform('any') & 
        m2.groupby(df['ID']).transform('any') & 
        df['code'].isin(['x', 'n36'])
    )
    df1 = df[m]
    

    # print(df1)
               ID code
    0   333_c_132    x
    2   333_c_132  n36
    8   998_c_134    x
    12  998_c_134  n36
    13  997_c_135    x
    17  997_c_135  n36
    

    【讨论】:

    • 你能推荐一些我可以学习这些东西的资源吗?我对 pandas 数据框有非常非正式的了解。谢谢。
    • 我建议你向官方的 pandas 文档学习,例如一个很好的资源是this official pandas guide。除此之外,使用groupby, transform, apply 的一个很好的资源是pandas groupby guide。但是,掌握这些概念的唯一方法是将这些学到的概念实际应用到实际数据本身上。
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    相关资源
    最近更新 更多