繁体   English   中英

使用isin函数后,无法在熊猫数据框上使用过滤器功能是有原因的吗?

[英]Is there a reason I cannot use the filter function on a pandas Dataframe after using the isin function?

有人可以帮我弄清楚为什么我不能在使用过isin函数的数据框上使用过滤器功能吗? 我已将answer.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   

提前致谢

如果要查看已回答所有100个问题的信息,为什么在过滤时使用>符号? 做:

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

使用isin函数后,无法在熊猫数据框上使用过滤器功能是有原因的吗?

这取决于您的需要-是使用原始数据(我的第一个解决方案)中的过滤器长度,还是尼克松答案或我的第二个解决方案中的已过滤数据中的过滤器长。


我相信您需要在boolean indexing链2布尔掩码-首先用于过滤器删除的行,其次用于获取所有长度为100行:

mask1 = df_answers['deleted'] == 0
mask2 = df_answers.groupby('user_id')['user_id'].transform('size') == 100

df = df_answers[mask1 & mask2]

如果性能很重要而较大的数据更好则避免使用filter功能,因为速度慢,请检查计时

因此,如果要再次过滤:

df_answers_del = df_answers[df_answers['deleted'] == 0]
mask = df_answers_del.groupby('user_id')['user_id'].transform('size') == 100
df_answers_del_completed  = df_answers_del[mask]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM