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

如果列为NaN并且另一行中该列不是NaN,如何在数据帧中删除行

  •  1
  • Jesse  · 技术社区  · 7 年前

    我有一个python中的pandas数据帧,其中行由 p1 & p2 但是 p2 有时是 NaN :

       p1 p2
    0  a  1
    1  a  2
    2  a  3
    3  b  NaN
    4  c  4
    5  d  NaN
    6  d  5
    

    上面的数据帧是使用

    df.drop_duplicates(subset=["p1","p2"], keep='last')
    

    这在很大程度上有效,唯一的问题是 5 技术上不重复,因此不会丢弃。

    如何删除行(例如: "d", NaN )其中有另一行具有相同的 p1 p2 的价值 not.null 如。 "d", 5 . 重要的是 "b", NaN 因为有 具有的行 "b", not.null .

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

    我们可以 groupby ffill bfill 然后 drop_duplicates

    df.assign(p2=df.groupby('p1')['p2'].apply(lambda x : x.ffill().bfill())).\
          drop_duplicates(subset=["p1","p2"], keep='last')
    Out[645]: 
      p1   p2
    0  a  1.0
    1  a  2.0
    2  a  3.0
    3  b  NaN
    4  c  4.0
    6  d  5.0
    
        2
  •  1
  •   Sebastian Mendez    7 年前

    这组重复项本质上应该是包含 NaN 包含重复项的值和行 p1 元素,和跨两列重复的元素联合:

    dupe_1 = df['p1'].duplicated(keep=False) & df['p2'].isnull()
    dupe_2 = df.duplicated(subset=['p1','p2'])
    total_dupes = dupe_1 | dupe_2
    new_df = df[~total_dupes]
    

    请注意,对于以下数据帧,这将失败:

      p1  p2
    0  a NaN
    1  a NaN
    

    因为这两个元素都将被删除。因此,我们必须先跑 df.drop_duplicates(subset=['p1','p2'], inplace=True, keep='last') ,删除除其中一行之外的所有行,使解决方案再次正常工作。