Skip to main content
 首页 » 编程设计

python之使用 isin 函数后,我不能在 pandas Dataframe 上使用 filter 函数是有原因的吗

2025年05月04日19leader

有人能帮我弄清楚为什么我不能在我使用 isin 函数的 Dataframe 上使用 filter 函数吗?我已将 answers.csv 导入到 Pandas 数据框中。以下代码用于删除“已删除”== 1 的所有答案。

#remove 'deleted answers' rows from the answers df - cleaning purposes 
 
df_answers_del = df_answers[df_answers['deleted'].isin([0])] 
print(df_answers_del) 

这将返回答案数据框,并从 df 中删除所有已删除的答案。

      answer_id  user_id  deleted   ...     comments 
0             1     1015        0   ...          NaN 
1             2     1019        0   ...          NaN 
2             3     1015        0   ...          NaN 
3             5     1015        0   ...          NaN 
4             6     1099        0   ...          NaN             
5             7     1019        0   ...          NaN 
6             9     1099        0   ...          NaN 
7            10     1015        0   ...          NaN         

现在的想法是通过计算 DF 中 user_id 的出现次数来过滤已回答所有 100 个问题的用户。下面的代码在最后被截断了,这是代码的副本。 #df_answers_del.groupby('user_id').filter(lambda x: len(x) > 100)

#filter all rows where users have answered all 100 questions 
df_answers_del_completed = df_answers_del.groupby('user_id').filter(lambda x: len(x) > 100) 
print(df_answers_del_completed) 

Python 不会返回任何错误,只会返回一个空数据框。

Empty DataFrame 
Columns: [] 
Index: [] 

如果我使用 isin 函数删除第一段代码,它会按预期返回,只是包含一些带有已删除答案的额外行以及不正确的已完成用户数,因为过滤器仍然计算已删除答案中的“user_id” .

       answer_id  user_id  deleted   ...     comments 
0             1     1015        0   ...          NaN 
1             2     1019        0   ...          NaN 
2             3     1015        0   ...          NaN 
3             4     1099        1   ...          NaN 
4             5     1015        0   ...          NaN 
5             6     1099        0   ...          NaN             
6             7     1019        0   ...          NaN 
7             9     1099        0   ...          NaN 
8            10     1015        0   ...          NaN   

我希望结果看起来像这样。假设结果中的用户已回答所有 100 个问题,不包括已删除的答案。

      answer_id  user_id  deleted   ...     comments 
0             1     1015        0   ...          NaN 
1             2     1019        0   ...          NaN 
2             3     1015        0   ...          NaN 
3             5     1015        0   ...          NaN 
4             7     1019        0   ...          NaN                
5            10     1015        0   ...          NaN    

提前致谢

请您参考如下方法:

如果您想查看哪些回答了所有 100 个问题,为什么要在筛选时使用 > 符号?做:

df_answers_del_completed = (df_answers_del.groupby('user_id') 
                                         .filter(lambda x: len(x) == 100))