代码之家  ›  专栏  ›  技术社区  ›  the phoenix

从基于列值的分组数据帧中删除行

  •  0
  • the phoenix  · 技术社区  · 3 年前

    我想从数据帧中的每个子群中删除满足某些条件的行。子组根据两列进行分组 Days & ID ,这是我的数据框架:

    df = pd.DataFrame({'Days':[5,5,5,5,6,6],
                       'ID':['A11','A11','A11','A11','B12','B12'],
                        'Country':['DE','DE','FR','US','US','US'],
                        'Car1':['BMW','Volvo','Audi','BMW','Mercedes','BMW'],
                         'Car2':['Volvo','Mercedes','BMW','Volvo','Volvo','Volvo'],
                        'Car3':['Mercedes',nan,'Volvo',nan,nan,nan]},
                           )
    
        Days  ID   Country    Car1      Car2      Car3
    0     5  A11      DE       BMW     Volvo  Mercedes
    1     5  A11      DE     Volvo  Mercedes       nan
    2     5  A11      FR      Audi       BMW     Volvo
    3     5  A11      US       BMW     Volvo       nan
    4     6  B12      US  Mercedes     Volvo       nan
    5     6  B12      US       BMW     Volvo       nan
    

    我想从满足以下三个条件的每组中删除行:

    1. Car3=nan
    2. Car1=Car2 (from another row within the group)
    3. Car2=Car3 (from another row within the group)
    

    我想要的预期数据帧:

       Days   ID Country      Car1   Car2      Car3
    0     5  A11      DE       BMW  Volvo  Mercedes
    1     5  A11      FR      Audi    BMW     Volvo
    2     6  B12      US  Mercedes  Volvo       nan
    3     6  B12      US       BMW  Volvo       nan
    
    1 回复  |  直到 3 年前
        1
  •  3
  •   jezrael    3 年前

    您可以使用检查lambda函数中每个组的成员身份 Series.isin 并通过 ~ 在里面 boolean indexing :

    m = (df.groupby(['Days','ID'], group_keys=False)
          .apply(lambda x: x['Car1'].isin(x['Car2']) & x['Car2'].isin(x['Car3'])) & 
           df['Car3'].isna())
    
    df = df[~m].reset_index(drop=True)
    print (df)
       Days   ID Country      Car1   Car2      Car3
    0     5  A11      DE       BMW  Volvo  Mercedes
    1     5  A11      FR      Audi    BMW     Volvo
    2     6  B12      US  Mercedes  Volvo       NaN
    3     6  B12      US       BMW  Volvo       NaN