Pandas 在groupby之后选择行时获取空数据帧。有人知道为什么吗?

Pandas 在groupby之后选择行时获取空数据帧。有人知道为什么吗?,pandas,pandas-groupby,Pandas,Pandas Groupby,我想选择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 我尝试了以下代码,但都返回

我想选择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'])]
我想要的结果有点像这样:

ID,year,age
810006862,2000,49
810006862,2001,
810033622,2000,24
810033622,2001,25
你试过-

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
您可以使用:

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

非常感谢。还没有,让我试试!它工作得很好!谢谢。同时,你知道我的密码错在哪里吗?我能再问你一个问题吗?如果我要选择一个同时包含2000年和2001年以及仅包含2000年和2001年的组,该如何修改?因为我注意到,如果有一个组有一个2000年的行值,它也会被选中。出于我的目的,我只想选择同时拥有2000年和2001年的群体。谢谢。莫茨。在您的解决方案中是否只能选择2000年和2001年的行?抱歉,我对Python非常陌生,不知道如何修改代码以符合我的目的。:)重复第1步:
dfs.loc[dfs.year.isin([20002001])
Thank for the link可能重复。我将通读该链接,希望找到我的解决方案。谢谢。它工作正常。但是,它捕捉到了组/行也只有2000年。我想选择既有2000年又有2001年的组,而不仅仅是一个。有什么想法吗?嗨,再次。它工作得很好!非常感谢!!顺便问一下,你知道吗知道我的代码有什么问题吗?当你基于“ID”分组时,每个组都包含不同的年份。例如,对于你的示例数据,groupby返回组,ID=810006862的组为{2000200012003},ID=810023112的组为{2000200420052006},ID=810033622的组为{20002001}。因此,等式检查(x['year'])=={2000',2001})返回False。相反,您需要通过issubset()执行子集检查。这将选择年中包含2000和2001的所有组。然后,通过df2[df2['year'].isin(years)]排除包含2000和2001以外年份的行。解释得很好!现在我看到了逻辑。非常感谢您的帮助!