只保留满足另一列条件的行

时间:2018-12-27 16:12:30

标签: python pandas dataframe

所以现在我有一个像这样的Pandas DF:

Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Matt     2018        0
John     2018        0
Mary     2018        1
Mary     2019        1

我要保留具有Years 2018和2019的每个唯一名称的所有行。

结果应如下所示:

Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Mary     2018        1
Mary     2019        1

Matt和John被删除,因为他们都没有2018和2019。

任何想法将不胜感激!

3 个答案:

答案 0 :(得分:3)

使用crosstab选择两年的所有名称,然后使用isin

s=pd.crosstab(df.Name,df.Year)[[2018,2019]].eq(1).sum(1)==2
df.loc[df.Name.isin(s.index[s])]
Out[463]: 
   Name  Year
0  Jeff  2018
1  Jeff  2019
4  Mary  2018
5  Mary  2019

答案 1 :(得分:2)

使用groupby + transform

m1 = df.Year.eq(2018)   
m2 = df.Year.eq(2019)

df[m1.groupby(df.Name).transform('any') & m2.groupby(df.Name).transform('any')]

  Name  Year
0  Jeff  2018
1  Jeff  2019
4  Mary  2018
5  Mary  2019

概括:

years = [2018, 2019]
M = [df.Year.eq(year) for year in years]
df[np.logical_and.reduce([m.groupby(df.Name).transform('any') for m in M])]

   Name  Year
0  Jeff  2018
1  Jeff  2019
4  Mary  2018
5  Mary  2019

答案 2 :(得分:1)

您可以在“名称”上进行内部merge的操作,一旦在df中独立选择了两个年份,即可获得具有两个年份的“名称”,然后使用isin:< / p>

df.loc[df.Name.isin(df[df.Year == 2018].merge(df[df.Year == 2019],
                                              on='Name',how='inner').Name)]
   Name  Year  Label
0  Jeff  2018      0
1  Jeff  2019      1
4  Mary  2018      1
5  Mary  2019      1