有人可以帮我弄清楚为什么我不能在使用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
预先感谢
答案 0 :(得分:3)
如果要查看所有100个问题均已回答,为什么在过滤时使用>
符号?做:
df_answers_del_completed = (df_answers_del.groupby('user_id')
.filter(lambda x: len(x) == 100))
答案 1 :(得分:2)
使用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
功能,因为速度较慢,请检查timings。
因此,如果要再次过滤:
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]