首页 > 解决方案 > 使用 isin 函数后,我无法在 pandas Dataframe 上使用 filter 函数吗?

问题描述

有人可以帮我弄清楚为什么我不能在我使用 isin 函数的 Dataframe 上使用 filter 函数吗?我已将 answers.csv 导入熊猫数据框。以下代码用于删除“已删除”== 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   

提前致谢

标签: pythonpandas

解决方案


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

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

推荐阅读