Получить пустой фрейм данных при выборе строк после группировки. Кто-нибудь знает почему? - PullRequest
2 голосов
/ 03 октября 2019

Я хочу выбрать строки / группы, которые с 2000 и 2001 годами должны иметь 2000 и 2001 годы в наборе данных, как показано ниже:

ID,year,age
810006862,2000,49
810006862,2001,
810006862,2002,
810006862,2003,52
810023112,2000,27
810023112,2004,28
810023112,2005,29
810023112,2006,30
810033622,2000,24
810033622,2001,25

Я пробовал следующие коды, нооба вернулись с пустым фреймом данных.

df1411 = df.groupby('ID').filter(lambda x: set(x['year']) == {'2000', '2001'})

df[df.groupby('ID')['year'].transform(lambda x: set(x.values.tolist()) == {'2000','2001'})]

Эти два кода ниже выбирают одну дополнительную группу, у которой есть только 2000 год. Я хотел бы иметь группу с 2000 и 2001 годами.

df[df['year'].isin({2000, 2001})]
df.loc[df.year.isin(['2000', '2001'])]

Результат Iхочу что-то вроде этого:

ID,year,age
810006862,2000,49
810006862,2001,
810033622,2000,24
810033622,2001,25

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы можете использовать:

df[df['year'].isin({2000, 2001})]

Если вы хотите выбрать группы с 2000 и 2001 годами, а не только одну, как вы указали в комментарии, вы можете использовать:

years = {2000, 2001}
df2 = df.groupby('ID').filter(lambda x: years.issubset(x['year']))
df2[df2['year'].isin(years)]
#   ID          year    age
#0  810006862   2000    49.0
#1  810006862   2001    NaN
#8  810033622   2000    24.0
#9  810033622   2001    25.0
1 голос
/ 03 октября 2019

Вы пробовали -

df.loc[df.year.isin([2000, 2001])

Добавление в ваш комментарий это другой вопрос - но вы можете сделать это:

#Create a pivoted dataframe
dfp = df.pivot(index="ID", columns="year", values="year")
#Create a column in this pivoted dataframe to indicate whether both years are present
dfp["has_both_years"] = dfp.apply(lambda x: x["2000"] and x["2001"], axis=1)
#Select where True
dfp = dfp.loc[dfp.has_both_years.notnull()]
#Subset your original DataFrame
dfs = df.loc[df.ID.isin(dfp.index)]

#          ID  year age
#0  810006862  2000  49
#1  810006862  2001    
#2  810006862  2002    
#3  810006862  2003  52
#8  810033622  2000  24
#9  810033622  2001  25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...