Python 仅保留满足与另一列相关的条件的行

Python 仅保留满足与另一列相关的条件的行,python,pandas,dataframe,Python,Pandas,Dataframe,所以现在我有一个类似这样的例子: Name Year Label Jeff 2018 0 Jeff 2019 1 Matt 2018 0 John 2018 0 Mary 2018 1 Mary 2019 1 Name Year Label Jeff 2018 0 Jeff 2019

所以现在我有一个类似这样的例子:

Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Matt     2018        0
John     2018        0
Mary     2018        1
Mary     2019        1
Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Mary     2018        1
Mary     2019        1
我想保留2018年和2019年的每个唯一名称的所有行

结果应该如下所示:

Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Matt     2018        0
John     2018        0
Mary     2018        1
Mary     2019        1
Name     Year      Label

Jeff     2018        0
Jeff     2019        1
Mary     2018        1
Mary     2019        1
马特和约翰被免职,因为他们没有2018年和2019年的两个年头


任何想法都将不胜感激

使用
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

使用
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

使用
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

使用
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
df
中独立选择两个年份后,您可以对“Name”进行内部搜索,以获取具有两个年份的“Name”,然后使用
isin

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
df
中独立选择两个年份后,您可以对“Name”进行内部搜索,以获取具有两个年份的“Name”,然后使用
isin

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

你的年份栏只有这两年吗?或者,您的实际问题是查找所有组中都存在的名称?解决方案是不同的,所以请具体说明。栏目只有2018年和2019年您的年度栏目只有这两年吗?或者,您的实际问题是查找所有组中都存在的名称?解决方案不同,请具体说明。该列仅包含2018年和2019年