代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

如何根据特定列中发生次数的计数,从排除行的数据帧创建新的数据帧?

  •  1
  • Koray Tugay  · 技术社区  · 6 年前

    我有以下数据框:

         foo  bar
    0  Alice   42
    1  Alice   44
    2    Bob   22
    

    我试图得到一个新的数据帧,不包括最后一行,因为 Bob 列中只发生一次 foo

         foo  bar
    0  Alice   42
    1  Alice   44
    

    下面是我用来创建上述数据帧的代码:

    df = pd.DataFrame(
        {
            "foo": ["Alice", "Alice", "Bob"],
            "bar": [42, 44, 22]
        }
    )
    

    我对这个要求的方法(不起作用)。

    col_foo_gt_1 = df["foo"].value_counts() > 1
    print(col_foo_gt_1["Alice"])  # Prints true
    print(col_foo_gt_1["Bob"])  # Prints false
    
    df_bob_removed = pd.DataFrame(
        df[col_foo_gt_1[df["foo"]]]
    )
    

    我得到的错误是:

    ValueError: cannot reindex from a duplicate axis
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Tomas Farias    6 年前

    这是另一个解决方案 .transform 以下内容:

    df_bob_removed = df.loc[
        df.groupby('foo')['foo'].transform('count') > 1, 
    ]
    
         foo  bar
    0  Alice   42
    1  Alice   44
    
        2
  •  2
  •   sacuL    6 年前

    方法1

    使用 groupby filter 以下内容:

    df.groupby('foo').filter(lambda x: len(x) >1)
    
         foo  bar
    0  Alice   42
    1  Alice   44
    

    方法2

    您可以将索引设置为 foo 然后使用 loc 以下内容:

    df.set_index('foo').loc[(df.foo.value_counts() >1)]
    
           bar
    foo       
    Alice   42
    Alice   44
    

    如果要在此之后重置索引:

    df.set_index('foo').loc[(df.foo.value_counts() >1)].reset_index()
         foo  bar
    0  Alice   42
    1  Alice   44