Хранение только тех строк, которые удовлетворяют условию относительно другого столбца - PullRequest
0 голосов
/ 27 декабря 2018

Итак, сейчас у меня есть DF для Pandas:

Name     Year      Label

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

Я хочу сохранить все строки для каждого уникального имени, которое имеет оба года: 2018 и 2019.

Результатдолжен выглядеть примерно так:

Name     Year      Label

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

Мэтт и Джон были удалены, потому что у них не было и 2018, и 2019.

Любые идеи будут оценены!

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Использование 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
0 голосов
/ 27 декабря 2018

Вы можете выполнить внутреннее merge в поле «Имя», выбрав оба года независимо в df, чтобы получить «Имя», содержащее оба года, а затем использовать 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
0 голосов
/ 27 декабря 2018

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...